報錯信息以下:java
Cause: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure The last packet successfully received from the server was 97,130 milliseconds ago. The last packet sent successfully to the server was 24 milliseconds ago. ; SQL []; Communications link failure .... Caused by: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure
產生問題的直接緣由:mysql
致使數據庫會強行斷開已有的連接,就會報這個異常。git
產生問題的根本緣由:github
以mysql5版本爲例,其自身鏈接的等待時間(wait_timeout)缺省爲8小時,若是在wait_timeout秒期間內,數據庫鏈接(java.sql.Connection)一直處於等待狀態,mysql5就將該鏈接關閉。這時,你的Java應用的鏈接池仍然合法地持有該鏈接的引用。當用該鏈接來進行數據庫操做時,就會產生上述錯誤。sql
問題解決:數據庫
1、立刻止損的方法:安全
重啓服務器。(重啓服務器,數據庫鏈接池就會從新初始化, 從新獲取和數據庫的有效鏈接)服務器
2、避免產生上述問題的方法:【你須要本身按本身採用的鏈接池,類型去搜索相應的配置,不一樣鏈接池可能不一樣】app
一、數據庫鏈接池增長探活配置。(在鏈接池配置文件中增長下面的關鍵屬性) (推薦這種方式)性能
爲了解決這個異常,咱們在配置數據庫鏈接池的時候須要作一些檢查鏈接有效性的配置,這裏以Druid爲例,相關配置以下(更多配置):這裏還有一個(dbcp的配置)
字段名 | 默認值 | 說明 |
validationQuery | 用來檢測鏈接是否有效的sql,要求是一個查詢語句,經常使用select 'x'。若是validationQuery爲null,testOnBorrow、testOnReturn、testWhileIdle都不會起做用。 | |
validationQueryTimeout | 單位:秒,檢測鏈接是否有效的超時時間。底層調用jdbc Statement對象的void setQueryTimeout(int seconds)方法 | |
testOnBorrow | true | 申請鏈接時執行validationQuery檢測鏈接是否有效,作了這個配置會下降性能。 |
testOnReturn | false | 歸還鏈接時執行validationQuery檢測鏈接是否有效,作了這個配置會下降性能。 |
testWhileIdle | false | 建議配置爲true,不影響性能,而且保證安全性。申請鏈接的時候檢測,若是空閒時間大於timeBetweenEvictionRunsMillis,執行validationQuery檢測鏈接是否有效。 |
timeBetweenEvictionRunsMillis | 1分鐘(1.0.14) | 有兩個含義:1) Destroy線程會檢測鏈接的間隔時間,若是鏈接空閒時間大於等於minEvictableIdleTimeMillis則關閉物理鏈接。2) testWhileIdle的判斷依據,詳細看testWhileIdle屬性的說明 |
爲了不空閒時間過長超過最大空閒時間而被斷開,咱們設置三個配置:
validationQuery: SELECT 1 testWhileIdle: true timeBetweenEvictionRunsMillis: 28000
其中timeBetweenEvictionRunsMillis
須要小於mysql的wait_timeout
。
實例:
二、增大數據庫默認的超時等待時間(wait_timeout) 【若是太大,可能致使鏈接數較多,引發性能降低】
修改MySQL的參數,wait_timeout最大爲31536000即1年,在my.cnf中加入: [mysqld] wait_timeout=31536000 interactive_timeout=31536000 重啓生效,須要同時修改這兩個參數。
三、JDBC配置Mysql鏈接URL重連機制
jdbc:mysql://localhost:3306/test?user=root&password=&autoReconnect=true
四、JDBC減小鏈接池內鏈接生存週期:使之小於所設置的wait_timeout 的值
<property name="maxIdleTime" value="1800" />