当前位置: 首页 > 面试题库 >

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

百里涛
2023-03-14
问题内容

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

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

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

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

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

问题答案:

作为一个相当大的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),它会按预期工作。

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



 类似资料:
  • 线程可以等待,直到其他线程释放访问同步块的锁。我想知道当其他线程访问同步块时,一个线程可以等待多长时间?什么时候它会知道另一个线程释放了锁?

  • 问题内容: public class Deadlock { static class Friend { private final String name; public Friend(String name) { this.name = name; } public String getName() { return this.name; } public synchronized void b

  • 问题内容: 因此,我的目标是让函数启动自己的线程,以便可以并行运行,而不必等待上一个线程完成。问题在于,它似乎不是多线程的(意味着一个线程在另一个线程开始之前就完成了)。 我也有该函数的内部,但似乎启动的线程的标识与从其运行python脚本的主线程相同。我认为我的方法不正确。 问题答案: 这是常见错误,容易出错。 只需在主线程中一次执行您的函数,然后将(我想为您函数的返回值)作为函数传递给线程,这

  • 我一直在尝试写一些java应用程序。这个应用程序想要运行的是处理一个文本文件。 但是,输入文本文件很大(超过200MB),我尝试将200MB拆分为四个拆分文件(每个50MB) 所以,每一个都只需要0.5秒,但是用这种线性运行,每一个也需要2秒。(worker1+0.5s,worker2+0.5s,worker3+0.5s,worker4)如果我可以同时运行4个线程,我预计这个应用程序只需要0.5秒

  • 我正在使用Python和tkinter创建一个游戏,当我试图添加一些音乐时,制作音乐的函数停止了脚本的其余部分(还有窗口)。所以我需要创建一个新的线程来播放音频并保持窗口工作... 我尝试了一些错误、不运行或停止窗口的事情,目前我有: 重要的细节:playSound函数什么也不返回,所以什么都不需要等待它。我也不太懂用Python编程,我更喜欢用Luau。

  • 我有多个线程,它们都从一个对象运行。我希望“主线程”单独运行,直到某一点,然后它等待,所有其他线程一起运行,然后主线程唤醒,等等。。。。。我无法同步线程。我要么得到一个非法的监视器状态异常,要么它卡在一个“等待”循环中,该循环应该接收一个永远不会到达的“通知”。 更具体地说,我有一个带有数组的对象。阵列中的每个单元都有一个线程,该线程检查相邻单元,然后使用该信息更改其单元。为了有序地进行更改,我希