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

时间:2012-04-13 05:42:26

标签: c++ c multithreading prepared-statement libmysql

使用libmysqlclient_r.so即mysql连接器。 根据当前的arch,在thread1中为connection1准备stmt将被创建和缓存。 下一步为thread2 connection2缓存准备好的stmt将被重用。

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

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

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

请建议在整个帖子中共享准备stmts是否有问题?

2 个答案:

答案 0 :(得分:1)

AFAIK,准备好的语句与连接上下文一起创建/关联。原型函数需要连接作为输入参数,因此您无法重用connection_B中connection_A上下文中准备的预处理语句...

MYSQL_STMT *mysql_stmt_init(MYSQL *mysql)

答案 1 :(得分:0)

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

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