如何同时从多个线程访问MySQL

Isa*_*avo 21 c c++ mysql multithreading connection-pooling

我们正在做一个MySQL的小基准测试,我们希望看看它对我们的数据的执行情况.

该测试的一部分是看多个并发线程在服务器上使用各种查询进行操作时的工作原理.

MySQL文档(5.0)是不是多线程的客户真的清楚.我应该指出我确实链接了线程安全库(libmysqlclient_r.so)

我正在使用预准备语句并执行read(SELECT)和write(UPDATE,INSERT,DELETE).

  • 我应该为每个线程打开一个连接吗?如果是这样的话:我怎么做到这一点..它似乎mysql_real_connect()返回我打电话时得到的原始数据库句柄mysql_init())
  • 如果不是:我如何确保结果和方法,如mysql_affected_rows返回正确的值而不是与其他线程的调用冲突(互斥/锁可能工作,但感觉不对)

cha*_*cus 26

作为一个从多个线程调用MySQL的相当大的C应用程序的维护者,我可以说我只是在每个线程中创建一个新连接没有问题.我遇到的一些警告:

  • 编辑:似乎这个子弹只适用于版本<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_STMTs),它将按预期工作.

这似乎比向我建立连接池要少.

  • @chazomaticus,您通常会使用多少个线程以及您会打开多少个连接?这是否可以扩展到大量线程/连接?如果您有很多线程(100 个 - 1000 个)但不希望打开 1000 个连接的开销(您可能没有权限,因为 max_connections 的默认值通常设置为 100),连接池非常有用。如果您的线程数较少,那么您的方法将起作用。来自我的 +1 以显示代码示例。 (2认同)

Gle*_*len 6

您可以创建连接池.需要连接的每个线程都可以从池中请求一个免费的线程.如果没有可用的连接,则可以通过添加新连接来阻止或扩展池.

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

编辑:这是关于C中连接池的SO问题/答案

Edit2:这是一个用C++编写的MySQL连接池示例链接.(当你实现自己的goto语句时,你应该忽略它.)