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

标签 c++ mysql c multithreading connection-pooling

我们正在做一个 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/

相关文章:

c - 通过 fopen 创建文件在 Linux 上运行良好但在 Windows 上运行不正常(MS VS 2010)

c - 在c中使用wait()与waitpid()

android - 如何使用 Qt 5.6 让 NFC 在 Android 上运行

c++ - 为 32 位构建 zlib libz.a

mysql查询优化和服务器性能

php - MySQL/PHP - 用于从数据库中删除多行的复选框数组

c - c中多维数组的qsort导致段错误

c++ - 如果重复使用变量值,如何使变量保持在常量以下?

c++ - ptr_vector 是如何管理内存的?

C# MySQL 事务提交