【问题标题】:Making MySQL client program thread safe?使 MySQL 客户端程序线程安全?
【发布时间】:2012-06-04 23:18:52
【问题描述】:

我在运行使用 MySQL C API 的 D 编程时遇到了一个有趣的线程问题。我收到错误 2013“在查询期间丢失与 MySQL 服务器的连接”。当足够多的线程淹没网络接口缓冲区时,似乎会出现问题,但服务器仍有更多需要传输。这是我基于一些研究并在两台不同的计算机上运行程序的最佳猜测。一台计算机与服务器具有 100Mb 连接,另一台具有 1Gb 连接。具有 100Mb 连接的计算机会引发错误,而 1Gb 计算机则不会。我想知道我是否遇到了 MySQL 文档中How to Write a Threaded Client 第一段中描述的内容。如果是,我需要用 SIGPIPE 做什么,我该怎么做?

对于那些感兴趣的人,我在任何库调用之前调用 mysql_library_init,并且我正在使用 mysql_init 和 mysql_real_connect 为每个线程创建一个新的 MYSQL*。另外值得注意的是,我正在执行的查询是小型 SELECT,每个查询只返回几千条记录,所有查询都是从同一个表中执行的。

【问题讨论】:

  • 你能发布一个重现问题的 20 行程序吗?
  • 需要限制连接,可以使用信号量限制并发连接数
  • 您尝试建立多少个到 mysqld 的同时连接?您的 mysqld 将接受多少个连接?如果你要让它稳健地工作,你需要在连接数相对较少的 mysqld 服务器上测试你的线程化 C 软件;您将需要一个连接池。另外,不要忘记在使用完结果集和其他 C API 对象后释放它们:如果发生泄漏,您的 mysqld 可能会在 C 程序执行之前很久就耗尽资源。
  • 我一直在使用 2 到 7 之间的线程池。
  • 我要连接的服务器允许超过 64 个连接。它有 12 个物理内核和超过 100GB 的 RAM 分配给 mysqld。奥利,谢谢你的提醒。当我完成每组时,我正在执行一个 mysql_free_result。

标签: mysql c multithreading thread-safety d


【解决方案1】:

请在 mysql_real_connect 之前试试这个:

my_bool myb = 1;
mysql_options(conn, mysql_option.MYSQL_OPT_RECONNECT, &myb);

另外请查看这个 mysql 故障排除页面: http://dev.mysql.com/doc/refman/5.5/en/gone-away.html

【讨论】:

  • 感谢您的建议。我在按照您的建议调用 mysql_real_connect 之前启用重新连接。我已经多次阅读该页面并再次阅读以防万一我错过了什么。
猜你喜欢
  • 2012-08-14
  • 2019-03-20
  • 1970-01-01
  • 2011-05-22
  • 1970-01-01
  • 1970-01-01
  • 2013-08-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多