MySQL異常【資料庫斷開連線】:Communications link failure
阿新 • • 發佈:2018-11-22
一,異常資訊以及解決辦法
com.mysql.jdbc.exceptions.jdbc4.CommunicationsException:Communications link failure org.springframework.transaction.CannotCreateTransactionException: Could not open JDBC Connection for transaction; nested exception iscom.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure The last packet successfully received from the server was 6,388 milliseconds ago. The last packet sent successfully to the server was 1,504 milliseconds ago. at org.springframework.jdbc.datasource. DataSourceTransactionManager.doBegin(DataSourceTransactionManager.java:240)
異常分析:後端程式和MySQL通訊失敗了,即連線失敗。
為此:程式開啟資料庫連線戶,等到資料庫操作時,發現連線被MySQL關閉掉了。而在MySQL這一層,MySQL5配置上預設將連線的等待時間(wait_timeout) 預設為8小時。若連線超過8小時,會導致MySQL認為這個連線超時無效,然後進行關閉
解決辦法:
1. 在jdbc連線URL的配置中,你可以加上autoRecordnect=true
2. 既然問題是由mysql5的全域性變數wait_timeout的預設值太小引起的,我們將其改大就好了。 檢視mysql5的手冊,發現對wait_timeout的最大值分別是24天/365天(windows/linux)。以windows為 例,假設我們要將其設為21天,我們只要修改mysql5的配置檔案“my.ini”(mysql5 installation dir),增加一行:wait_timeout=1814400 ,需要重新啟動mysql5。 linux系統配置檔案:/etc/my.cnf
3. 我們可以將資料庫連線池的 validateQuery、testOnBorrow(testOnReturn)開啟,這樣在 每次從連線池中取出且準備使用之前(或者使用完且在放入連線池之前)先測試下當前使用是否好用,如果不好用,系統就會自動destory掉。或者testWhileIdle項是設定是否讓後臺執行緒定時檢查連線池中連線的可用性。
二:根本解決辦法:程式碼優化