我在這裏查看了關於此主題的相關問題,並且搜索了一段時間。我似乎還不明白Tomcat的DBCP配置或機制中的暗語。同樣的故事:Tomcat DBCP + MySQL,MySQLNonTransientConnectionException:連接關閉後不允許任何操作
我的Tomcat 6,DBCP在資源配置server.xml
:
<Resource name="jdbc/myDB" auth="Container" description="Database connection"
type="javax.sql.DataSource"
driverClassName="com.mysql.jdbc.Driver"
url="jdbc:mysql://myhost:3306/mydb?autoReconnectForPools=true&useUnicode=true"
username="user"
password="password"
validationQuery="SELECT 1"
testOnBorrow="true"
testWhileIdle="true"
timeBetweenEvictionRunsMillis="10000" minEvictableIdleTimeMillis="60000"
maxActive="20" maxWait="20000" maxIdle="10"
removeAbandoned="true" removeAbandonedTimeout="60" logAbandoned="true" />
我也找了MySQL的wait_timeout
,這是默認28800
。
總之,我嘗試了幾個選項,但似乎問題是mysql連接閒置28800秒,服務器關閉它們。我認爲游泳池應該以某種方式處理這種情況,validationQuery
和testOnBorrow
,但似乎我錯了。
如果我在url
中使用autoReconnect
空閒期後我的第一個查詢嘗試結果爲「...CommunicationsException: The last packet successfully received from the server was 157,493,261 milliseconds ago.
」,但在此之後它工作正常。
如果我在url
中使用autoReconnectForPools
或者只是不使用它 - 閒置期(8小時)後我每次都得到「.MySQLNonTransientConnectionException: No operations allowed after connection closed
」。
在這兩種情況下,事情順利進行時,應用程序已加載。所以,我斷定連接是從mysql的一端關閉的。
幫助,我錯過了什麼?我想在不改變Mysql中的wait_timeout的情況下解決這個問題。目標穩定的應用程序,如果它發生空閒時間可以生存:)
我可能會說,問題在於,服務器在超時後關閉連接,但dbcp不做任何事情,不重新連接,不驗證,不從本身到期。 – dmitry