如何从多个线程访问MySQL并发(How to access MySQL from multiple

2019-07-18 19:13发布

我们正在做的MySQL的一个小地方的基准,我们希望看到它如何执行我们的数据。

该测试的一部分就是看它是如何工作的,当多个并发线程锤与各种查询服务器。

在MySQL文档 (5.0)是不是多线程的客户真的清楚。 我要指出的是,我做的对线程安全的库链接( libmysqlclient_r.so

我使用准备好的语句,并做两个读(SELECT),写(UPDATE,INSERT,DELETE)。

  • 我应该打开每个线程一个连接? 如果是的话:我怎么连做..它似乎mysql_real_connect()返回原始DB句柄,我当我打电话mysql_init()
  • 如果不是:我如何确保结果等方法, mysql_affected_rows返回,而不是与其他线程的调用(互斥/锁可以工作,但感觉不对)碰撞正确的值

Answer 1:

作为一个相当大的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)和你希望它会工作。

这似乎是比建立连接池,我少工作。



Answer 2:

你可以创建一个连接池。 每一个需要连接线可以请求从池中一个免费的。 如果没有可用的连接,那么你要么块,或通过添加到一个新的连接长池。

有一篇文章在这里描述亲的和反对的连接池(虽然它是基于Java的)

编辑:这是关于一个SO问题/答案用C连接池

EDIT2:下面是一个样本的链接连接池为MySQL用C ++编写。 (你应该忽略goto语句,当你实现你自己的。)



Answer 3:

似乎从MySQL文档清楚,我认为任何特定的MYSQL结构可以在一个线程中使用毫无困难-使用在不同的线程在同一 MYSQL结构同时显然是想给你非常不可预知的结果作为状态存储在MySQL连接内。

因此可以创建每个线程的连接或使用的连接池上面所建议的,保护访问该池中使用某种互斥的(即保留或释放连接)。



Answer 4:

MySQL的线程客户端用C

它指出,mysql_real_connect()不是线程默认情况下是安全的。 客户端库需要编译的线程访问。



文章来源: How to access MySQL from multiple threads concurrently