Mysql中JDBC如何實現(xiàn)自動重連機制的實例

最近在工作中發(fā)現(xiàn)了一個問題,通過查找相關(guān)的資料終于解決了,下面這篇文章主要給大家介紹了關(guān)于jdbc實現(xiàn)mysql自動重連機制的相關(guān)資料,文中給出多種解決的方法,需要的朋友可以參考借鑒,下面來一起看看吧。

前言

本文主要給大家介紹的是關(guān)于JDBC實現(xiàn)mysql自動重連機制的相關(guān)內(nèi)容,分享出來供大家參考學習,下面來一起看看詳細的介紹:

日志:using the Connector/J connection property ‘autoReconnect=true’ to avoid this problem

com.mysql.jdbc.CommunicationsException:?The?last?packet?successfully?received?from?the?server?was58129?seconds?ago.The?last?packet?sent?successfully?to?the?server?was?58129?seconds?ago,?which?is?longer?than?the?server?configured?value?of?'wait_timeout'.?You?should?consider?either?expiring?and/or?testing?connection?validity?before?use?in?your?application,?increasing?the?server?configured?values?for?client?timeouts,?or?using?the?Connector/J?connection?property?'autoReconnect=true'?to?avoid?this?problem.

查了一下,原來是MySQL超時設(shè)置的問題

如果連接閑置8小時 (8小時內(nèi)沒有進行數(shù)據(jù)庫操作), mysql就會自動斷開連接, 要重啟tomcat.

解決辦法:

第一種:如果不用hibernate的話, 則在 connection url中加參數(shù): autoReconnect=true

?jdbc.url=jdbc:mysql://ipaddress:3306/database?autoReconnect=true&autoReconnectForPools=true

第二種:用hibernate的話, 加如下屬性:

?<property>true</property>  ?<property>true</property>  ?<property>true</property>

第三種:要是還用c3p0連接池:

?<property>1</property>?  ?<property>0</property>?  ?<property>0</property>  ?<property>true</property>

第四種:最不好的解決方案

使用Connector/J連接MySQL數(shù)據(jù)庫,程序運行較長時間后就會報以下錯誤:

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屬性避免該錯誤。

后來查了一些資料,才發(fā)現(xiàn)遇到這個問題的人還真不少,大部分都是使用連接池方式時才會出現(xiàn)這個問題,短連接應(yīng)該很難出現(xiàn)這個問題。

這個問題的原因:

MySQL服務(wù)器默認的“wait_timeout”是28800秒即8小時,意味著如果一個連接的空閑時間超過8個小時,MySQL將自動斷開該 連接,而連接池卻認為該連接還是有效的(因為并未校驗連接的有效性),當應(yīng)用申請使用該連接時,就會導致上面的報錯。

⑴.按照錯誤的提示,可以在JDBC URL中使用autoReconnect屬性,實際測試時使用了autoReconnect=true& failOverReadOnly=false,不過并未起作用,使用的是5.1版本,可能真像網(wǎng)上所說的只對4之前的版本有效。

⑵.沒辦法,只能修改MySQL的參數(shù)了,wait_timeout最大為31536000即1年,在my.cnf中加入:

[mysqld]    wait_timeout=31536000    interactive_timeout=31536000

重啟生效,需要同時修改這兩個參數(shù)。

總結(jié)

? 版權(quán)聲明
THE END
喜歡就支持一下吧
點贊7 分享