可以跨线程共享准备好的语句

May prepared statements be shared across threads?

本文关键字:准备好 语句 共享 线程      更新时间:2023-10-16

using libmysqlclient_r.so 即c MySQL Connector.根据当前架构,在用于连接 1 的线程 1 中,将创建并缓存准备好的 stmt。接下来,对于线程 2 连接 2,将重用缓存的准备好的 STMT。

执行后,程序在随机位置抛出分段错误。

注意:如果我只保留一个线程并执行,那么它永远不会抛出分段错误。

我没有在mysql文档中找到任何关于它的内容,即使我遵循了以下所有必要的步骤:http://dev.mysql.com/doc/refman/4.1/en/threaded-clients.html

请建议是否在线程中共享准备 stmts 是问题?

AFAIK ,预准备语句是创建/与连接上下文关联的。prototype 函数需要连接作为输入参数,因此您不能重用在 connection_B 中connection_A上下文中准备的准备语句......

MYSQL_STMT *mysql_stmt_init(MYSQL *mysql)

我个人的经验是,只要设置了某种锁定机制并且所有线程都使用相同的连接,它们就可以共享。

我遇到了一些奇怪的双重释放和内存损坏,这可能是由两个线程为预准备语句设置参数并大致同时启动它们引起的。一旦我使用互斥锁来防止线程这样做,崩溃就消失了。性能损失并不高:在设置预准备语句参数和查询本身上花费的时间很少,如果您的查询需要很长时间才能执行,您的里程可能会有所不同。