com.mysql.jdbc.exceptions.jdbc4.CommunicationsException:Communications link failure Last packet sent to the server was X ms ago
使用Connector/J連接MySQL數據庫,程序運行較長時間后就會報這個錯誤,有時錯誤還會提示你修改wait_timeout或是使用Connector/J的autoReconnect屬性避免該錯誤。
錯誤的原因:
MySQL服務在長時間不連接之后斷開了,斷開之后的首次請求會拋出這個異常
原因分析:
1、既然是長時間不連接之后斷開了,那這個時間應該是可以設定的,或者現在mysql用的還是默認的值
2、如何查看現在的時間值,以及如何修改我的mysql是安裝在windows系統上,就以這個說明,若是在開發中mysql安裝在linux上,操作步驟幾乎一樣
查看默認值:
1、DOC命令啟動mysql:mysql -hlocalhost -u用戶名 -p密碼
2、查看和連接mysql時間有關的系統變量:show variables like '%timeout%'

1)interactive_timeout:
參數含義:服務器關閉交互式連接前等待活動的秒數。交互式客戶端定義為在mysql_real_connect()中使用CLIENT_INTERACTIVE選項的客戶端。
參數默認值:28800秒(8小時)
(2)wait_timeout:
參數含義:服務器關閉非交互連接之前等待活動的秒數。
在線程啟動時,根據全局wait_timeout值或全局interactive_timeout值初始化會話wait_timeout值,取決於客戶端類型(由mysql_real_connect()
的連接選項CLIENT_INTERACTIVE定義)。
參數默認值:28800秒(8小時)
wait_timeout:超時控制的變量,其時間為長度為28800s,就是8個小時,在8個小時之后會斷開,需要重新連接,可以在訪問的url中使用
jdbc.url=jdbc:mysql://localhost:3306/nd?autoReconnect=true來是連接自動恢復,但這是mysql4及其以下版本使用,在mysql5中已經無效,必須調整系統變量來控制
Mysql5中對wait_timeout和interactive_timeout有兩個說明:interactive_timeout:服務器關閉交互式連接前等待活動的秒數。交互式客戶端定義為在
mysql_real_connect()中使用CLIENT_INTERACTIVE選項的客戶端。又見wait_timeout
wait_timeout:服務器關閉非交互連接之前等待活動的秒數。在線程啟動時,根據全局wait_timeout值或全局interactive_timeout值初始化
會話wait_timeout值,取決於客戶端類型(由mysql_real_connect()的連接選項CLIENT_INTERACTIVE定義),又見interactive_timeout
結論:
若要修改的話,需要同時修改這兩個變量
變量值大小確定:修改的話,如果變量值有范圍大小限制,肯定不要超過變量的最大范圍值,查資料知:在windows環境中:1-2147483s,
Linux環境中:1-31536000s
解決方案:
修改MySQL的參數,wait_timeout最大為31536000即1年,在my.cnf中加入:
[mysqld]
wait_timeout=31536000
interactive_timeout=31536000
重啟生效,需要同時修改這兩個參數。
如果你使用的是hibernate,需要修改連接池的設置,因為 hibernate自帶的連接池性能很差,可以使用C3P0,然后配置:
test
c3p0將建一張名為Test的空表,並使用其自帶的查詢語句進行測試。如果定義了這個參數那么 屬性preferredTestQuery將被忽略。你不能在這張Test表上進行任何操 作,它將只供c3p0測試使用。
https://blog.csdn.net/zouxucong/article/details/53924414
https://blog.csdn.net/Amen_Wu/article/details/55292248
