導致“mysql has gone away”的兩種情況


導致“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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM