我们正在做的MySQL的一个小地方的基准,我们希望看到它如何执行我们的数据。
该测试的一部分就是看它是如何工作的,当多个并发线程锤与各种查询服务器。
在MySQL文档 (5.0)是不是多线程的客户真的清楚。 我要指出的是,我做的对线程安全的库链接( libmysqlclient_r.so
)
我使用准备好的语句,并做两个读(SELECT),写(UPDATE,INSERT,DELETE)。
- 我应该打开每个线程一个连接? 如果是的话:我怎么连做..它似乎
mysql_real_connect()
返回原始DB句柄,我当我打电话mysql_init()
- 如果不是:我如何确保结果等方法,
mysql_affected_rows
返回,而不是与其他线程的调用(互斥/锁可以工作,但感觉不对)碰撞正确的值
作为一个相当大的C应用程序,使得MySQL的多个线程调用的维护者,我可以说我已经与简单地使每个线程一个新的连接没有问题。 我所遇到的一些注意事项:
- 编辑:看来这个子弹只适用于版本<5.5; 看到此页为您适当的版本 :就像你说你已经在做,链接对
libmysqlclient_r
。 - 呼叫
mysql_library_init()
一次,从main()
阅读关于在多线程环境中使用的文档,看看它为什么是必要的。 - 创建一个新的
MYSQL
使用结构mysql_init()
的每个线程。 这有调用的副作用mysql_thread_init()
为您服务。 mysql_real_connect()
照常每个线程内,以其特定线程MYSQL结构。 - 如果您正在创建/销毁大量的线程,你要使用
mysql_thread_end()
在每个线程的结束(和mysql_library_end()
在结束main()
这是很好的做法呢。
基本上,不共享MYSQL
结构或任何创建特定于结构(即MYSQL_STMT
S)和你希望它会工作。
这似乎是比建立连接池,我少工作。
你可以创建一个连接池。 每一个需要连接线可以请求从池中一个免费的。 如果没有可用的连接,那么你要么块,或通过添加到一个新的连接长池。
有一篇文章在这里描述亲的和反对的连接池(虽然它是基于Java的)
编辑:这是关于一个SO问题/答案用C连接池
EDIT2:下面是一个样本的链接连接池为MySQL用C ++编写。 (你应该忽略goto语句,当你实现你自己的。)
似乎从MySQL文档清楚,我认为任何特定的MYSQL结构可以在一个线程中使用毫无困难-使用在不同的线程在同一 MYSQL结构同时显然是想给你非常不可预知的结果作为状态存储在MySQL连接内。
因此可以创建每个线程的连接或使用的连接池上面所建议的,保护访问该池中使用某种互斥的(即保留或释放连接)。
MySQL的线程客户端用C
它指出,mysql_real_connect()不是线程默认情况下是安全的。 客户端库需要编译的线程访问。