導致“mysql has gone away”的兩種情況 By Cruise
1. wait_timeout參數 在開發代理server時, 我使用了jdbc連接數據庫,並采用長連接的方式連接數據庫。開發完后的測試ok,但到了第二天測試時發現數據庫操作失敗,並拋出“mysql has gone away”的異常,主要原因是在mysql中有一個wait_timeout參數,默認設置為8個小時,當超過8個小時沒有數據交互時,mysql服務器會主動關閉掉超時的連接,對應的mysql 錯誤碼是2006。 這個時候需要業務側做相關的處理,當發現有這種異常時需要重新連接數據庫。其實在使用wbl mysql庫時,wbl已經為我們做了這些,代碼如下: if (mysql_real_query(_Mysql, sql.c_str(), sql.length())) { string err(sql.c_str(),0,128); int ret_errno = mysql_errno(_Mysql); Close(); if (ret_errno == 2013 || ret_errno == 2006){ // CR_SERVER_LOST,重連一次 Connect(); } 2. max_allowed_packet參數 當查詢接口每秒鍾的請求到達60個以上時,發現日志中出現了大量的“mysql has gone away”,但這個時候的數據庫連接是正常的,這個時候就和例外一個mysql參數有關。show variables like 'max_allowed_packet'查看了下,發現max_allowed_packet參數設置的是1M,正是max_allowed_packet設置的太小導致了該問題,將max_allowed_packet設置為16M,問題徹底解決。 |
http://blog.csdn.net/wireless_tech