Java+Tomcat, Dying database connection?

2022-09-03 07:03:03

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

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

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

下面是上下文中的配置.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

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


答案 1

雄猫文档

DBCP 使用 Jakarta-Commons Database Connection Pool。它依赖于Jakarta-Commons组件的数量:

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

此属性可能会对您有所帮助。

removeAbandonedTimeout="60"

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

testWhileIdle=true
timeBetweenEvictionRunsMillis=300000

答案 2

只是为了澄清实际上是什么导致了这种情况。默认情况下,MySQL在处于非活动状态8小时后终止打开的连接。但是,数据库连接池将保留连接的时间超过此时间。

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


推荐