我们正在做一个 MySQL 的小型基准测试,我们想看看它对我们的数据的执行情况。
该测试的一部分是查看当多个并发线程通过各种查询冲击服务器时它是如何工作的。
MySQL documentation (5.0) 对多线程客户端并不是很清楚。我应该指出,我确实链接到线程安全库 (libmysqlclient_r.so
)
我正在使用准备好的语句并同时执行读取 (SELECT) 和写入 (UPDATE、INSERT、DELETE)。
- 我应该为每个线程打开一个连接吗?如果是这样:我该怎么做.. 似乎
mysql_real_connect()
返回了我调用mysql_init()
) 时得到的原始数据库句柄
- 如果不是:如何确保结果和方法(如
mysql_affected_rows
)返回正确的值,而不是与其他线程的调用发生冲突(互斥锁/锁可以工作,但感觉不对)
最佳答案
作为一个从多个线程调用 MySQL 的相当大的 C 应用程序的维护者,我可以说我在每个线程中简单地建立一个新连接没有任何问题。我遇到的一些警告:
- 编辑:此项目符号似乎仅适用于版本 < 5.5;见 this page for your appropriate version : 就像你说的那样,链接到
libmysqlclient_r
。 - 调用
mysql_library_init()
(一次,来自main()
)。阅读有关在多线程环境中使用的文档,了解其必要性。 - 使用
mysql_init()
创建一个新的MYSQL
结构在每个线程中。这有调用mysql_thread_init()
的副作用。为你。mysql_real_connect()
像往常一样在每个线程中,具有线程特定的 MYSQL 结构。 - 如果您要创建/销毁大量线程,则需要使用
mysql_thread_end()
在每个线程的末尾(和mysql_library_end()
在main()
的末尾)。无论如何,这是一种很好的做法。
基本上,不要共享 MYSQL
结构或为该结构创建的任何特定内容(即 MYSQL_STMT
),它会按您的预期工作。
这似乎比为我建立一个连接池要少。
关于c++ - 如何同时从多个线程访问 MySQL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1455190/