我有一个 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 就像错误所说的那样,但连接不断中断。我以前从未见过这种情况发生。

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

有帮助吗?

解决方案

Tomcat 文档

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

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

这个属性可能会帮助你。

removeAbandonedTimeout="60"

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

testWhileIdle=true
timeBetweenEvictionRunsMillis=300000

其他提示

只是为了澄清到底是什么原因造成的。默认情况下,MySQL 在 8 小时不活动后终止打开的连接。但是,数据库连接池保留连接的时间将超过该时间。

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

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

我不知道上面的答案是否基本上做同样的事情,但我们的一些系统大约每周使用一次数据库连接,我发现我们向 mysql 提供了一个 -Otimeout 标志或类似的东西来设置连接暂停。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top