我们正在对 MySQL 进行一个小型基准测试,希望了解它对我们的数据的执行情况。
该测试的一部分是看看当多个并发线程用各种查询攻击服务器时它是如何工作的。
The MySQL 文档 http://dev.mysql.com/doc/refman/5.0/en/c.html(5.0) 对于多线程客户端并不太清楚。我应该指出,我确实链接了线程安全库(libmysqlclient_r.so
)
我正在使用准备好的语句并执行读取(选择)和写入(更新、插入、删除)。
- 我应该为每个线程打开一个连接吗?如果是这样:我该怎么做......看来
mysql_real_connect()
返回我调用时得到的原始数据库句柄mysql_init()
)
- 如果不是:我如何确保结果和方法,例如
mysql_affected_rows
返回正确的值,而不是与其他线程的调用冲突(互斥/锁可以工作,但感觉不对)
作为一个相当大的 C 应用程序的维护者,该应用程序从多个线程进行 MySQL 调用,我可以说我在每个线程中简单地建立一个新连接没有任何问题。我遇到的一些警告:
-
编辑:看来这个项目符号仅适用于 此页面适合您的版本:就像你说的你已经在做的那样,链接到
libmysqlclient_r
.
- Call mysql_library_init() http://dev.mysql.com/doc/refman/5.0/en/mysql-library-init.html(一次,从
main()
)。阅读有关在多线程环境中使用的文档,了解为什么有必要。
- 制作一个新的
MYSQL
结构使用mysql_init() http://dev.mysql.com/doc/refman/5.0/en/mysql-init.html在每个线程中。这有调用的副作用mysql_thread_init() http://dev.mysql.com/doc/refman/5.0/en/mysql-thread-init.html为你。mysql_real_connect()
与往常一样,在每个线程内都有其线程特定的 MYSQL 结构。
- 如果您要创建/销毁大量线程,您将需要使用mysql_thread_end() http://dev.mysql.com/doc/refman/5.0/en/mysql-thread-end.html在每个线程的末尾(并且mysql_library_end() http://dev.mysql.com/doc/refman/5.0/en/mysql-library-end.html在......的最后
main()
)。无论如何,这是一个很好的做法。
基本上不分享MYSQL
结构或特定于该结构创建的任何内容(即MYSQL_STMT
s) 并且它将按您的预期工作。
对我来说,这似乎比创建连接池要少。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)