最近碰到一個mysql數據庫的問題就是一個標准的servlet/tomcat網絡應用後台使用mysql數據庫問題是待機一晚上後第二天早上第一次登錄總是失敗察看日志發現如下錯誤
commysqljdbcexceptionsjdbcCommunicationsException: Communications link failure
Last packet sent to the server was ms ago
經過一番調研發現很多人都碰到過類似問題但網上令人滿意的回答並不多mysql網站上的提問也很多但並沒有正確答案百度知道上倒是有一個近似正確的回答現將本人的解決辦法總結一下
上述問題是由mysql數據庫的配置引起的mysql將其連接的等待時間(wait_timeout)缺省為小時在其客戶程序中可以這樣來查看其值
mysql﹥
mysql﹥ show global variables like wait_timeout;
+++
| Variable_name | Value |
+++
| wait_timeout | |
+++
row in set ( sec)
seconds也就是小時
如果在wait_timeout秒期間內數據庫連接(javasqlConnection)一直處於等待狀態mysql就將該連接關閉這時你的Java應用的連接池仍然合法地持有該連接的引用當用該連接來進行數據庫操作時就碰到上述錯誤這解釋了為什麼我的程序第二天不能登錄 的問題
你可能會想到在tomcat的數據源配置中有沒有辦法解決?的確在jdbc連接url的配置中你可以附上autoReconnect=true但這僅對mysql以前的版本起作用增加validation query似乎也無濟於事
本人覺得最簡單的辦法就是對症下藥既然問題是由mysql的全局變量wait_timeout的缺省值太小引起的我們將其改大就好了
查看mysql的手冊發現對wait_timeout的最大值分別是天/天(windows/linux)以windows為 例假設我們要將其設為天我們只要修改mysql的配置文件myini(mysql installation dir)增加一行wait_timeout=
需要重新啟動mysql
linux系統配置文件/etc/mycnf
測試顯示問題解決了
From:http://tw.wingwit.com/Article/program/MySQL/201311/29638.html