mybatis Communications link failure的解決辦法


可能需要設置一:

使用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&amp;characterEncoding=utf-8" /><!-- &amp;   換成 & 后 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。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM