Mysql中JDBC如何實作自動重連機制的實例

黄舟
發布: 2017-07-26 15:32:36
原創
2918 人瀏覽過

最近在工作中發現了一個問題,透過尋找相關的資料終於解決了,以下這篇文章主要給大家介紹了關於JDBC實現Mysql自動重連機制的相關資料,文中給出多種解決的方法,需要的朋友可以參考借鑒,下面來一起看看吧。

前言

本文主要介紹給大家介紹的是JDBC實作Mysql自動重連機制的相關內容,分享出來供大家參考學習,下面來一起看看詳細的介紹:

日誌: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逾時設定的問題

#如果連線閒置8小時(8小時內沒有進行資料庫操作), mysql就會自動斷開連接, 要重啟tomcat.

解決方法:

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


 jdbc.url=jdbc:mysql://ipaddress:3306/database?autoReconnect=true&autoReconnectForPools=true
登入後複製

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


 <property name="connection.autoReconnect">true</property>
 <property name="connection.autoReconnectForPools">true</property>
 <property name="connection.is-connection-validation-required">true</property>
登入後複製

第三種:如果還要用c3p0連接池:


 <property name="hibernate.c3p0.acquire_increment">1</property> 
 <property name="hibernate.c3p0.idle_test_period">0</property> 
 <property name="hibernate.c3p0.timeout">0</property>
 <property name="hibernate.c3p0.validate">true</property>
登入後複製

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

使用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 last packet successfully sent to the server was ***  millisecond agoago。

其中錯誤也會提示你修改wait_timeout或是使用Connector/J的autoReconnect屬性避免該錯誤。

後來查了一些資料,才發現遇到這個問題的人還真不少,大部分都是使用連接池方式時才會出現這個問題,短連接應該很難出現這個問題。

這個問題的原因:

MySQL伺服器預設的「wait_timeout」是28800秒即8小時,表示如果一個連線的空閒時間超過8個小時, MySQL將自動斷開該連接,而連接池卻認為該連接還是有效的(因為並未校驗連接的有效性),當應用申請使用該連接時,就會導致上面的報錯。

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

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


[mysqld]

wait_timeout=31536000

interactive_timeout=31536000
登入後複製

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

總結

#

以上是Mysql中JDBC如何實作自動重連機制的實例的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!