2012-03-17 103 views
3

我目前使用的是tomcat 6和MySQL 5.1.56。 它使用Mysql Connector-j獲取數據庫連接並使用它們。 我已根據此鏈接設置連接池。連接池中的Tomcat-Mysql連接在空閒時間後超時

http://people.apache.org/~fhanik/tomcat/jdbc-pool.html

一切,只要我使用它工作正常。

如果我讓它閒置幾個小時,那麼我無法執行任何查詢。 我收到以下異常。

com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: **No operations allowed after connection closed.** 
java.lang.RuntimeException: com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: No operations allowed after connection closed. 

Caused by: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: **Communications link failure** 

The last packet successfully received from the server was 31,858,914 milliseconds ago. The last packet sent successfully to the server was 11 milliseconds ago. 
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) 
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39) 
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27) 
    at java.lang.reflect.Constructor.newInstance(Constructor.java:513) 
    at com.mysql.jdbc.Util.handleNewInstance(Util.java:411) 
    at com.mysql.jdbc.SQLError.createCommunicationsException(SQLError.java:1116) 
    at com.mysql.jdbc.MysqlIO.reuseAndReadPacket(MysqlIO.java:3090) 
    at com.mysql.jdbc.MysqlIO.reuseAndReadPacket(MysqlIO.java:2979) 
    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3520) 
    at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1990) 
    at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2151) 
    at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2625) 
    at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:2119) 
    at com.mysql.jdbc.PreparedStatement.executeQuery(PreparedStatement.java:2281) 

我看到堆棧上的另一個人溢出同樣的問題,但沒有回答。 Database Connections Timing Out (Connection Pooling On Tomcat)

我在這裏找到了一個解決方案,但我不能使用它,因爲它指示我使用另一個我沒有權限的第三方應用程序。

https://groups.google.com/group/ctjug-forum/browse_thread/thread/c326d3595d0c91af 

有沒有什麼辦法可以解決這個問題,而不必訴諸部署第三方jar文件/應用。

我已經嘗試了諸如autoreconnect,連接前後測試連接以及所有其他選項等選項。

這是conext.xml

<Resource name="jdbc/appdb" auth="Container" 
       type="javax.sql.DataSource" 
       username="**********" 
       password="**********" 
       driverClassName="com.mysql.jdbc.Driver" 
       url="jdbc:mysql://localhost:3306/appdb?autoReconnect=true" 
       maxActive="15" maxIdle="3" 
       testWhileIdle="true" 
       testOnBorrow="true" 
       testOnReturn="false" 
       validationQuery="SELECT 1" 
       validationInterval="30000" 
       timeBetweenEvictionRunsMillis="30000"/> 

什麼是在這種情況下的最佳實踐的解決方案我的當前設置?

我在mysql日誌中找不到任何東西。

+0

您是如何解決這個問題的? – mass 2015-03-18 03:13:48

回答

2

您不應該將任何連接打開幾個小時。

您應該有一個持久層,從一個池中獲取一個連接,執行操作,提交或回退,並關閉連接以在儘可能最小的範圍內將其返回池。如果您不限制每個會話連接一個連接,則您的應用程序將具有更高的可擴展性。您的應用程序足夠響應,因爲該池將分攤通過所有請求打開每個連接的成本。

某些池的配置允許您在將其連出池之前檢查連接,並在連接不成熟時提供新連接。瞭解如何使用您的游泳池/應用程序服務器進行操作。

+1

是的,這就是我在做什麼。連接返回到池後發生問題。如果我將應用程序閒置幾個小時,則池中的連接將變得無法使用。這是我正在努力解決的問題。 – 2012-03-18 20:27:41

+0

@kensenjohn:你是如何解決這個問題的?除了autoreconnect外,我使用相同的配置。它的工作原理,但如果我使用SSL,我會得到相同的錯誤。 – Sefran2 2013-11-26 14:54:40

2

添加下列屬性的資源標記

validationQuery="select 1" 
testOnBorrow="true" 
validationInterval="YOUR_VALIDATON_INTERVAL" 

和tomcat從連接池借用時,它會驗證連接。

+0

你會注意到我的問題,我已經設置了所有這些參數,但我仍然有問題。在耗盡了所有這些選項之後,我寫下了這個問題。 – 2012-03-18 20:29:38

1

我有這個配置工作了一段時間,但我連接到Oracle數據庫。我覺得30秒對於validationInterval和timeBetweenEvictionRunsMillis來說太短了,但這隻意味着測試會更頻繁地運行。

除此之外,我已經設置numTestsPerEvictionRun爲「-1」,這意味着它將測試所有的空閒連接。現在,該文件明確指出,這個屬性沒有被使用,所以真的不知道它是否會有所幫助。你將不得不嘗試找出答案。

numTestsPerEvictionRun="-1"
+0

我會嘗試一下,但正如你所提到的,它確實指出tomcat不使用這個參數。謝謝。 – 2012-03-18 20:34:19

相關問題