2012-03-17 78 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

相关问题