连接池在 Tomcat 7 中以静默方式过期,但自动重新连接=true 无法修复它



我已经收到这些异常好几个星期了,但没有解决方案......

com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: 从服务器成功接收的最后一个数据包是 179,695,604 毫秒前。

成功发送到服务器的最后一个数据包是 179,695,604 毫秒前。 比服务器配置的值"wait_timeout"长。在应用程序中使用之前,应考虑过期和/或测试连接有效性,增加客户端超时的服务器配置值,或使用连接器/J 连接属性"autoReconnect=true"来避免此问题

因此,我更改了应用程序的上下文.xml以在Tomcat 7中为连接池设置数据库的autoReconnect=true标记。我什至在上下文文件中将wait_timeout设置为无穷大。

我错过了什么?这是一个常见问题吗?它似乎在网上有少量信息,但是当我遵循这些指南时,同样的事情发生在一段时间不活动后的第二天。

我使用服务器的次数越多,这种情况发生得越少。我认为池连接已过期,但如果wait_timeout失败,我如何阻止它们过期?关于如何诊断问题或配置文件的任何想法?

我遇到了类似的问题,autoReconnect=true 抛出了 CommunicationsException 异常,但随后创建了一个与 mysql 的新连接。因此,下一个请求将成功。此行为将继续发生,空闲时间后的第一个请求将失败。为了补充 Alex 已经回答的内容,我将以下参数添加到我的 JDBC 连接字符串中,但我不再看到错误。

 testOnBorrow="true" validationQuery="SELECT 1" validationInterval="60000"

testOnBorrow的描述充分解释了它。好消息是我不必对代码进行任何更改。

引用:https://tomcat.apache.org/tomcat-7.0-doc/jdbc-pool.htmlhttp://www.tomcatexpert.com/blog/2010/04/01/configuring-jdbc-pool-high-concurrency

MySQL Connector/J 文档说autoReconnect

如果启用,驱动程序将为在 上发出的查询引发异常 属于当前事务的过时或死连接, 但将在下一个查询发出之前尝试重新连接 新事务中的连接。

这意味着您仍然会得到例外。

JDBI 等连接器通过在空闲、从池中借用和返回到池时添加可选的测试查询来解决此问题。也许您可以在自己的 JDBC 连接包装器中添加一些东西来执行相同的操作。或者,按照文档进行autoReconnect并正确捕获由死/过时连接引起的 SQLException。

关于这个答案,使用 DBCP 和 c3p0 还有更多有用的参考

最新更新