簡體   English   中英

JDBC CommunicationsException與MySQL數據庫

[英]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&amp;useUnicode=true&amp;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&amp;useUnicode=true&amp;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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM