MySql的Communications link failure解決辦法

這兩天在日誌中看到關於數據庫報的異常:

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

Windows下修改:在%MySQL HOME%/bin下有mysql.ini配置文件,打開後在如下位置添加兩個變量,賦值。(這裡修改為388000)

保存退出,重啟mysql服務,一定是重啟musql服務,便能看到修改結果

windows下的配置文件具體是哪個需要從windows系統服務中找到mysql,打開屬性,看“可執行文件路徑”裡面的參數值,因為它可能是my.cnf而

不是my.ini,這是由於安裝時的設置,我們可能會忽略它。

Linux環境下修改:配置文件在:cd /etc/my.cnf

擴展:1.MySQL服務器所支持的最大連接數是有上限的,因為每個連接的建立都會消耗內存,因此我們希望客戶端在連接到MySQL Server處理完

相應的操作後,應該斷開連接並釋放佔用的內存。如果你的MySQL Server有大量的閒置連接,他們不僅會白白消耗內存,而且如果連接一直在累

加而不斷開,最終肯定會達到MySQL Server的連接上限數,這會報'too many connections'的錯誤。對於wait_timeout的值設定,應該根據系統

的運行情況來判斷。在系統運行一段時間後,可以通過show processlist命令查看當前系統的連接狀態,如果發現有大量的sleep狀態的連接進程,

則說明該參數設置的過大,可以進行適當的調整小些。

2.編程時也可以使用連接池設置超時時間,配置相對簡單。但修改數據庫更為本質一些

---------------------

原文:https://blog.csdn.net/zouxucong/article/details/53924414

MySql的Communications link failure解決辦法


分享到:


相關文章: