[英]JDBC CommunicationsException with MySQL Database
我的MySQL連接池有一點麻煩。 就是這種情況:
通過Quartz安排了不同的作業。 所有作業都連接到不同的數據庫,這全天都能正常工作,而夜間計划的作業因CommunicationsException而失敗...
石英作業:
Job1 runs 0 0 6,10,14,18 * * ?
Job2 runs 0 30 10,18 * * ?
Job3 runs 0 0 5 * * ?
如您所見,最后一個作業在18點運行,大約需要1個小時才能運行。 凌晨5點的第一項工作失敗了。 我已經在資源配置中嘗試了各種參數組合,這是我現在正在運行的參數組合:
<!-- Database 1 (MySQL) -->
<Resource
auth="Container"
driverClassName="com.mysql.jdbc.Driver"
maxActive="100"
maxIdle="30"
maxWait="10000"
removeAbandoned="true"
removeAbandonedTimeout="60"
logAbandoned="true"
type="javax.sql.DataSource"
name="jdbc/appDbProd"
username="****"
password="****"
url="jdbc:mysql://127.0.0.1:3306/appDbProd?autoReconnect=true&useUnicode=true&characterEncoding=UTF-8"
testWhileIdle="true"
testOnBorrow="true"
testOnReturn="true"
validationQuery="SELECT 1"
timeBetweenEvictionRunsMillis="1800000"
/>
<!-- Database 2 (MySQL) -->
<Resource
auth="Container"
driverClassName="com.mysql.jdbc.Driver"
maxActive="100"
maxIdle="30"
maxWait="10000"
removeAbandoned="true"
removeAbandonedTimeout="60"
logAbandoned="true"
type="javax.sql.DataSource"
name="jdbc/prodDbCopy"
username="****"
password="****"
url="jdbc:mysql://127.0.0.1:3306/prodDbCopy?autoReconnect=true&useUnicode=true&characterEncoding=UTF-8"
testWhileIdle="true"
testOnBorrow="true"
testOnReturn="true"
validationQuery="SELECT 1"
timeBetweenEvictionRunsMillis="1800000"
/>
<!-- Database 3 (MSSQL)-->
<Resource
auth="Container"
driverClassName="net.sourceforge.jtds.jdbc.Driver"
maxActive="30"
maxIdle="30"
maxWait="100"
removeAbandoned="true"
removeAbandonedTimeout="60"
logAbandoned="true"
name="jdbc/catalogDb"
username="****"
password="****"
type="javax.sql.DataSource"
url="jdbc:jtds:sqlserver://127.0.0.1:1433;databaseName=catalog;useNdTLMv2=false"
testWhileIdle="true"
testOnBorrow="true"
testOnReturn="true"
validationQuery="SELECT 1"
timeBetweenEvictionRunsMillis="1800000"
/>
出於明顯的原因,我更改了IP,用戶名和密碼,但是可以看到它們確實是正確的,因為該應用程序整天都可以成功運行。
最煩人的事情是:運行第一個作業的第一個作業成功查詢了Database2,但是由於某種原因而無法查詢Database1(CommunicationsException):
引起原因:com.mysql.jdbc.exceptions.jdbc4.CommunicationsException:從服務器成功收到的最后一個數據包是39,376,539毫秒之前。 成功發送到服務器的最后一個數據包是39,376,539毫秒之前。 大於服務器配置的“ wait_timeout”值。 您應考慮在應用程序中使用連接之前使連接有效性到期和/或對其進行測試,或者增加服務器為客戶端超時配置的值,或者使用Connector / J連接屬性'autoReconnect = true'來避免此問題。
有任何想法嗎? 謝謝!
如前所述,在連接池上啟用連接驗證。
當連接閑置一會兒時出現此錯誤。 您的工作是否會在某個時候停止訪問數據庫,然后運行一些查詢?
當鏈接失敗時,也會發生這種情況,您可能需要與網絡團隊聯系,以確認連接是否斷開。
我在使用Oracle和JDBC時遇到了類似的問題。 最終,我消耗了數據庫可用的所有連接,並且我沒有放棄任何連接,並且我的代碼只會暫停或超時。 看一下您如何處理代碼中的連接。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.