1. 程式人生 > >MySQL異常【資料庫斷開連線】:Communications link failure

MySQL異常【資料庫斷開連線】:Communications link failure

一,異常資訊以及解決辦法

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項是設定是否讓後臺執行緒定時檢查連線池中連線的可用性。

二:根本解決辦法:程式碼優化