編碼的世界 / 優質文選 / 歷史

MySql的Communications link failure解決辦法


2022年7月18日
-   

這兩天在日志中看到關於數據庫報的異常:
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.編程時也可以使用連接池設置超時時間,配置相對簡單。但修改數據庫更為本質一些

熱門文章