MySql的Communications link failure解決辦法

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

com.MySQL.jdbc.exceptions.jdbc4.CommunicationsException:Communications link failure Last packet sent to the server was X ms agomysql

使用Connector/J鏈接MySQL數據庫,程序運行較長時間後就會報這個錯誤,有時錯誤還會提示你修改wait_timeout或是使用Connector/J的autoReconnect屬性避免該錯誤。linux

錯誤的緣由:MySQL服務在長時間不鏈接以後斷開了,斷開以後的首次請求會拋出這個異常sql

緣由分析:一、既然是長時間不鏈接以後斷開了,那這個時間應該是能夠設定的,或者如今mysql用的仍是默認的值數據庫

       二、如何查看如今的時間值,以及如何修改個人mysql是安裝在windows系統上,就以這個說明,如果在開發中mysql安裝在Linux上,操做步驟幾乎同樣編程

查看默認值:一、DOC命令啓動mysql:mysql -hlocalhost -u用戶名 -p密碼windows

二、查看和鏈接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()url

的鏈接選項CLIENT_INTERACTIVE定義)。
參數默認值:28800秒(8小時).net

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   

wait_timeout=31536000

interactive_timeout=31536000

擴展:1.MySQL服務器所支持的最大鏈接數是有上限的,由於每一個鏈接的創建都會消耗內存,所以咱們但願客戶端在鏈接到MySQL Server處理完

相應的操做後,應該斷開鏈接並釋放佔用的內存。若是你的MySQL Server有大量的閒置鏈接,他們不只會白白消耗內存,並且若是鏈接一直在累

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

的運行狀況來判斷。在系統運行一段時間後,能夠經過show processlist命令查看當前系統的鏈接狀態,若是發現有大量的sleep狀態的鏈接進程,

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

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

相關文章
相關標籤/搜索