16

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

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

com.mysql.jdbc.exceptions.jdbc4.CommunicationsException:上一个从服务器成功接收到的数据包是68051秒前。最后一个成功发送到服务器的数据包是 68051 秒前,比服务器配置的“wait_timeout”值长。您应该考虑在应用程序中使用之前使连接有效性过期和/或测试,增加客户端超时的服务器配置值,或使用连接器/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

4 回答 4

11

Tomcat 文档

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

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

这个属性可以帮助你。

removeAbandonedTimeout="60"

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

testWhileIdle=true
timeBetweenEvictionRunsMillis=300000
于 2008-08-19T13:40:10.283 回答
4

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

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

于 2008-09-16T16:12:44.707 回答
1

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

于 2009-02-09T13:21:44.390 回答
0

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

于 2008-08-19T19:06:11.730 回答