開發(fā)部署的應(yīng)用程序竿屹,一直都在正常運行各淀,但最近一次訪問盾鳞,突然獲取不到數(shù)據(jù)犬性。
報錯主要信息:
com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure
The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server.
錯誤解析:
從錯誤信息中可以看出,應(yīng)用與mysql服務(wù)器的通信鏈接失敗了腾仅,接收不到mysql服務(wù)器返回的數(shù)據(jù)包乒裆。
解決方法總結(jié):
方法一:
檢查數(shù)據(jù)庫連接地址是否正確。(配置文件中url)
方法二:
mysql5
以前的版本在jdbc連接url上增加autoReconnect=true
配置(表示自動連接)
方法三:
mysql5將其連接的等待時間wait_timeout
缺省為8小時(28800秒)推励,如果在wait_timeout
期間內(nèi)鹤耍,數(shù)據(jù)庫連接一直處于等待狀態(tài),mysql5將關(guān)閉連接验辞,此時稿黄,應(yīng)用的連接池仍然合法持有該數(shù)據(jù)庫的連接引用,但當(dāng)執(zhí)行數(shù)據(jù)庫操作時跌造,就出現(xiàn)了上述報錯杆怕。
因此,解決方法就是:修改mysql全局變量wait_timeout的值鼻听。
怎么修改wait_timeout
的值呢财著?
在文件my.ini的最后增加一行:wait_timeout=2073600
,然后重啟mysql(2073600秒 = 24天)
說明:my.init文件撑碴,windows系統(tǒng)中在mysql的安裝目錄下撑教,如:C:\ProgramData\MySQL\MySQL Server 8.0\my.ini
。
linux系統(tǒng)中位置為/etc/my.ini
醉拓,或在/etc目錄或其他目錄下查找一下:find /etc/ -type f -name 'my.ini' -printf '%p \n'
伟姐。
擴展學(xué)習(xí):
1. 與mysql服務(wù)器的連接方式
與mysql服務(wù)器的連接方式,分為兩種:交互式連接亿卤,非交互式連接愤兵。
<1> 交互式連接
交互式連接:指的是客戶端方式連接,連接到mysql服務(wù)器排吴,一般都有重連機制(斷開后操作sql會自動連接)
可分為:
- 指令連接
CMD終端命令執(zhí)行連接指令秆乳,連接mysql服務(wù)器。
#mysql -hlocalhost -p3306 -u root -p
- 工具連接
如navicat數(shù)據(jù)庫管理工具钻哩,連接mysql時屹堰,內(nèi)部封裝了客戶端連接指令。
<2> 非交互式連接
非交互式連接:指的是非客戶端方式連接街氢,如應(yīng)用程序連接池扯键,JDBC等
2. 參數(shù)說明
<1> wait_timeout
wait_timeout:表示非交互式連接時,連接處于空閑狀態(tài)多久珊肃,會被mysql切斷掉荣刑。
默認(rèn)是28800秒馅笙,即8小時。這個默認(rèn)的時間比較短厉亏。(非交互式連接董习,wait_timeout才生效)
<1> interactive_timeout
interactive_timeout:表示交互式連接,連接處于空閑狀態(tài)多久叶堆,會被mysql切斷掉阱飘。
默認(rèn)是28800秒,即8小時虱颗。(交互式連接沥匈,interactive_timeout才生效)
3. 連接異常情況整理
情況1:The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server.
情況2:ERROR 2013 (HY000): Lost connection to MySQL server during query
情況1和情況2為非交互式連接(如tomcat運行項目)請求訪問數(shù)據(jù)庫連接異常。
情況3:ERROR 2006 (HY000): MySQL server has gone away. No connection. Trying to reconnect...
情況3為交互式連接異常忘渔,如客戶端連接到命令行mysql>...