Java + Tomcat,Dying数据库连接?

时间:2008-08-19 10:17:24

标签: java mysql database tomcat

我有一个tomcat实例设置,但我在context.xml中配置的数据库连接在一段时间不活动后仍然死亡。

当我检查日志时,我收到以下错误:

com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: 从服务器成功收到的最后一个数据包是68051秒 前。成功发送到服务器的最后一个数据包是68051秒 以前,它比服务器配置的值长 'WAIT_TIMEOUT'。您应该考虑到期和/或测试 在您的应用程序中使用之前的连接有效性,增加 服务器配置的客户端超时值,或使用Connector / J 连接属性'autoReconnect = true'以避免此问题。

这是context.xml中的配置:

<Resource name="dataSourceName" 
        auth="Container" 
        type="javax.sql.DataSource"
        maxActive="100" 
        maxIdle="30" 
        maxWait="10000" 
        username="username" 
        password="********"
        removeAbandoned = "true"
        logAbandoned = "true"
        driverClassName="com.mysql.jdbc.Driver" 
        url="jdbc:mysql://127.0.0.1:3306/databasename?autoReconnect=true&amp;useEncoding=true&amp;characterEncoding=UTF-8"  />

我正在使用autoReconnect=true,就像错误所说的那样,但连接一直在消亡。我以前从未见过这种情况。

我还验证了所有数据库连接都已正确关闭。

4 个答案:

答案 0 :(得分:9)

Tomcat Documentation

DBCP使用Jakarta-Commons数据库连接池。它依赖于Jakarta-Commons组件的数量:

* Jakarta-Commons DBCP
* Jakarta-Commons Collections
* Jakarta-Commons Pool

此属性可能会帮助您。

removeAbandonedTimeout="60"

我正在使用相同的连接池,我正在设置这些属性以防止同样的事情,它只是没有通过tomcat配置。 但如果第一件事不起作用,请试试这些。

testWhileIdle=true
timeBetweenEvictionRunsMillis=300000

答案 1 :(得分:5)

只是为了澄清实际导致这种情况的原因。 MySQL默认情况下会在8小时不活动后终止打开的连接。但是,数据库连接池将保留连接的时间超过该值。

因此,通过设置timeBetweenEvictionRunsMillis = 300000,您将指示连接池运行连接并每隔5分钟逐出并关闭空闲连接池。

答案 2 :(得分:1)

自DBCP 1.2起,不推荐使用removeAbandoned选项(尽管1.3分支中为still present)。 Here是非正式的解释。

答案 3 :(得分:0)

我不知道上面的答案是否基本相同,但我们的一些系统每周大约使用一次数据库连接,我看到我们提供了一个-Otimeout标志或类似于mysql的东西设置连接超时。