小编典典

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

mysql

我们正在做一个MySQL的小型基准测试,我们希望了解它对数据的性能。

该测试的一部分是查看当多个并发线程对服务器执行各种查询时,服务器如何工作。

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

我正在使用准备好的语句,并且同时执行读取(SELECT)和写入(UPDATE,INSERT,DELETE)操作。

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

阅读 697

收藏
2020-05-17

共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_STMTs),它会按预期工作。

与为我建立连接池相比,这似乎省去了很多工作。

2020-05-17