2013-01-24 21 views
0

我在這裏查看了關於此主題的相關問題,並且搜索了一段時間。我似乎還不明白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秒,服務器關閉它們。我認爲游泳池應該以某種方式處理這種情況,validationQuerytestOnBorrow,但似乎我錯了。

如果我在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的情況下解決這個問題。目標穩定的應用程序,如果它發生空閒時間可以生存:)

+0

我可能會說,問題在於,服務器在超時後關閉連接,但dbcp不做任何事情,不重新連接,不驗證,不從本身到期。 – dmitry

回答

0

我想了一下,決定留下這個問題,雖然問題根本不在Tomcat DBCP中。我的決定是因爲我發現了很多類似的問題,其中許多沒有答案,並且從未發現可能發生的事情的線索。所以,我在這裏留言,就像一個警告的人突然走同樣的道路:

問題是,我必須使用數據庫,被初始化一次就好,比如資源:

class MyClass { 
    private MyResource res = null; 

    private MyResource getMyResource() { 
     if (res == null) res = new MyResource(getConnection()); 
     return res; 
    } 

    private Connection getConnection() { 
     .... 
     con = dataSource.getConnection(); 
     .... 
     return con; 
    } 
} 

當我的應用程序在Servlet中時,導致MyResource實例是唯一的實例,並且連接打開。所以,當MySQL服務器終止過期的連接時,我的應用程序會在第一次查詢時得到關於超時的異常,但是由於autoReconnect以後的查詢連接將再次活躍起來。游泳池沒有觸及連接,因爲它從未被釋放。

最後,我意識到它,並通過改變getMyResource固定:

private MyResource getMyResource() { 
    return new MyResource(getConnection()); 
} 

對我來說,這是合理的。改變之後,所有事情都按預期開始工作。

+0

後,我完全運行此異常請返回您的連接使用後到游泳池?爲了做到這一點,你必須調用connection.close()方法。如果您的連接不是由池管理,它將會過期。 – bhdrkn

+0

我已經寫完了我現在所做的一切。我被傳喚並將我的問題視爲與DBCP相關,但最終沒有成功。 – dmitry

0

不知道它是否會有所幫助,但有一個更新的(在Tomcat 7.x中更好)的連接池實現 - 使用它,將其添加到您的配置:

factory="org.apache.tomcat.jdbc.pool.DataSourceFactory" 

我敢肯定,所有其他選項都是一樣的。 請參閱http://people.apache.org/~fhanik/jdbc-pool/jdbc-pool.html

+0

感謝您的信息,但它是相當不確定的,它會解決我的問題或不:) :) – dmitry

+0

從commons-dbcp連接池升級到org.apache.tomcat.jdbc.pool – Ralph

相關問題