关于mysql:Java + Tomcat,数据库连接中断了吗?

关于mysql:Java + Tomcat,数据库连接中断了吗?

Java+Tomcat, Dying database connection?

我有一个tomcat实例安装程序,但是在context.xml中配置的数据库连接在一段时间不活动之后一直死掉。

当我检查日志时,出现以下错误:

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

这是context.xml中的配置:

1
2
3
4
5
6
7
8
9
10
11
12
<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&useEncoding=true&characterEncoding=UTF-8"  />

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

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


Tomcat文档

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

1
2
3
* Jakarta-Commons DBCP
* Jakarta-Commons Collections
* Jakarta-Commons Pool

此属性可以帮助您。

1
removeAbandonedTimeout="60"

我正在使用相同的连接池内容,并且正在设置这些属性以防止未通过tomcat配置该内容。
但是,如果第一件事不起作用,请尝试这些。

1
2
testWhileIdle=true
timeBetweenEvictionRunsMillis=300000

只是为了弄清实际上是什么原因造成的。默认情况下,MySQL在闲置8小时后会终止打开的连接。但是,数据库连接池将保留的连接时间更长。

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


从DBCP 1.2开始,不推荐使用removeAbandoned选项(尽管在1.3分支中仍然存在)。这是一个非官方的解释。


我不知道上面的答案是否基本相同,但是我们的某些系统每周大约使用一次数据库连接,而且我已经看到我们向MySQL提供了-Otimeout标志或类似的东西来设置连接暂停。


推荐阅读