mysql_query() 沒有使用 C API 將命令傳遞給 MySQL 伺服器
我有這個問題,但經過更深入的調查後,我意識到懸掛不是問題。讀完這個文章後,我決定問一個新問題。
例如,我將此字元串傳遞給
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,它適用於 MySQL 命令的超過 500k 次執行。
當我將此 MCVE 程式碼插入到我的項目中並註釋我現有
main()
的以便從 MCVE 執行主要功能時,然後在幾千$$ or even only hundred $$突然執行的 MySQL 命令再次沒有送出到 MySQL 伺服器。 更具體地說:在嵌入式 MCVE 執行之前,僅初始化我的項目的靜態對象。
對於這些靜態初始化,這一定很奇怪,因為沒有其他程式碼行正在執行。
問題:
知道發生了什麼嗎?特別是命令顯然是
$$ why should I doubt the MySQL Server log file $$沒有從 C API 客戶端送出到 MySQL 伺服器真的很困擾我。
技術數據:
- SLES 12.3 作為 VM 在 XenServer 7.4 上執行
gcc
使用7.3編譯,-std=c++17
幾乎所有警告選項。- 使用安裝了所有 SLES 更新的預設 SLES 12.3 glibc 2.22。
- 連接 MySQL 社區伺服器 5.7.21
- C API 客戶端 5.7.21
使用者Gerard H Pille給了我正確的提示 - 看聊天。
我不得不刪除
MYSQL_OPT_RECONNECT
設置,現在它可以工作了。該程序現在執行了兩個多月,沒有任何問題1。根據 MCVE,這是這兩行程式碼:
bool autoReconnectMySQL = true; mysql_options( mysqlConnection, MYSQL_OPT_RECONNECT, &autoReconnectMySQL );
為什麼設置會導致此問題,我無法回答。
新測試結果: MySQL C API 8.0.11 不再有這個問題。
1現在,它執行了 1 年多沒有任何問題。