我问了这个问题,但经过更深入的调查后,我意识到悬挂不是问题所在。阅读此线程后,我决定提出一个新问题。
例如,我将这个字符串传递给mysql_query()
函数:
SELECT 1
当我运行几千条这个命令时mysql_query()
,命令没有提交到 MySQL 服务器!
我检查了 MySQL 日志文件,我简直不敢相信,但是命令不在那里,因此mysql_query()
永远不会返回,因为它没有从服务器收到任何答复。
MySql 在执行之前将命令写入日志文件。我试过了SELECT SLEEP(10)
。
笔记:
我知道,这确实意味着很多,但它在 SLES 11.3/XenServer 6.5 上工作了 3 年,没有任何问题。注意:这是一个 MCVE,它也不能正常工作!
自从我将它移至 SLES 12.3和XenServer 7.4 后,问题就开始了。
C++代码非常简单——我在写这个问题之前已经检查了3周。关键是这个问题在 ~10k 查询之后开始。VM 仍有约 3 GB 的空闲 RAM。
关于 MCVE 的注意事项:
我创建了一个MCVE,它适用于超过 500k 次的 MySQL 命令执行。
当我将此 MCVE 代码插入到我的项目中并评论我现有main()
的代码以便从 MCVE 执行主要功能时,然后在几千次 [甚至只有数百次] 执行之后,MySQL 命令突然再次未提交到 MySQL 服务器。
更具体地说:在嵌入式 MCVE 运行之前,只有我的项目的静态对象被初始化。
对于这些静态初始化,这一定很奇怪,因为没有其他代码行在运行。
问题:
知道发生了什么事吗?尤其是命令显然 [我为什么要怀疑 MySQL 服务器日志文件] 没有从 C API 客户端提交到 MySQL 服务器这一事实真的让我很不安。
技术数据:
- 作为 VM 在 XenServer 7.4 上运行的 SLES 12.3
gcc
使用7.3编译,-std=c++17
几乎每个警告选项。- 使用安装了所有 SLES 更新的默认 SLES 12.3 glibc 2.22。
- 连接到 MySQL Community Server 5.7.21
- C API 客户端 5.7.21
用户Gerard H Pille给了我正确的提示 - 请参阅聊天。
我不得不删除
MYSQL_OPT_RECONNECT
设置,现在它可以工作了。该程序现在运行了 2 个多月没有任何问题1。根据 MCVE,这是这两行代码:
为什么设置导致此问题我无法回答。
新测试结果: MySQL C API 8.0.11 没有这个问题了。
1现在运行1年多没有任何问题。