可能需要設置一:
使用Connector/J連接MySQL數據庫,程序運行較長時間后就會報以下錯誤:
Communications link failure,The last packet successfully received from the server was *** millisecond ago.The last packet successfully sent to the server was *** millisecond ago。
其中錯誤還會提示你修改wait_timeout或是使用Connector/J的autoReconnect屬性避免該錯誤。
后來查了一些資料,才發現遇到這個問題的人還真不少,大部分都是使用連接池方式時才會出現這個問題,短連接應該很難出現這個問題。這個問題的原因:
MySQL服務器默認的“wait_timeout”是28800秒即8小時,意味着如果一個連接的空閑時間超過8個小時,MySQL將自動斷開該連接,而連接池卻認為該連接還是有效的(因為並未校驗連接的有效性),當應用申請使用該連接時,就會導致上面的報錯。
修改MySQL的參數,wait_timeout最大為31536000即1年,在my.cnf中加入:
[mysqld]
wait_timeout=31536000
interactive_timeout=31536000
重啟生效,需要同時修改這兩個參數。
可能需要設置二:
<dataSource type="POOLED"> <property name="driver" value="com.mysql.jdbc.Driver" /> <property name="url" value="jdbc:mysql://47.96.128.xxx:8066/TESTDB?useUnicode=true&characterEncoding=utf-8" /><!-- & 換成 & 后 mybatis會報錯--> <property name="username" value="root" /> <property name="password" value="wuhan85123_" /> <property name="poolMaximumActiveConnections" value="100" /> <property name="poolMaximumIdleConnections" value="30" /> <property name="poolPingEnabled" value="true"/> <property name="poolPingQuery" value="select 1"/> <property name="poolPingConnectionsNotUsedFor" value="1800000"/> </dataSource>
poolPingEnabled - 發送到數據庫的偵測查詢,用來檢驗連接是否處在正常工作秩序中並准備接受請求。默認是“NO PING QUERY SET”,這會導致多數數據庫驅動失敗時帶有一個恰當的錯誤消息。
poolPingQuery - 對數據庫進行ping時所使用的sql,最好是一個非常快的 SQL。
poolPingConnectionsNotUsedFor - 默認值是0,單位是毫秒。我們不能在每次使用連接池之前,都使用ping機制,這會使每一條sql的執行,都要額外執行一次ping語句。所以使用此屬性來避免這種不合理做法。我們只針對閑置時間超過某個時間的連接,進行ping。本例中的值為半小時,當從連接池中拿出的連接閑置超過半小時,才會對它進行ping。