如何正确处理连接空闲超时错误

Posted

技术标签:

【中文标题】如何正确处理连接空闲超时错误【英文标题】:how to properly handle connection idle timeout error 【发布时间】:2011-10-18 14:24:14 【问题描述】:

我正在使用 Java 和 SpringFramework 在 mysql Server 上使用 JdbcTemplate 类进行数据库编程。

使用org.apache.commons.dbcp.BasicDataSource作为db数据源。

有时当连接长时间空闲时,CommunicationException 会抛出以下消息:

The last packet successfully received from the server was XXXXX milliseconds ago.

我不想通过将 autoReconnect 参数添加到连接或添加将在每个查询之前执行 select 1 的属性来处理此问题,以确保正确打开连接。我也不想碰mysql服务器的配置和提高超时值。

我想做的是正确处理该异常。

我想过捕获CommunicationException,然后重试直到成功,如果失败超过 X 次,则抛出异常,表明重试 X 次失败。

有没有人知道如何处理这个问题? 我的想法怎么样? :) 也许 springframework 中有一些东西会自动为我做这件事而我错过了?

任何信息将不胜感激。

谢谢!

【问题讨论】:

为什么不想使用自动重连? 我读到 autoReconnect 参数已被弃用 "不推荐使用 autoReconnect 选项,因为没有安全的方法重新连接到 MySQL 服务器而不会有损坏连接状态或数据库状态信息的风险。相反,您应该使用连接池这将使您的应用程序能够使用池中的可用连接连接到 MySQL 服务器。不推荐使用 autoReconnect 工具,并且可能会在将来的版本中删除。",来自dev.mysql.com/doc/refman/5.1/en/… 【参考方案1】:

如果您的查询是可重新启动的,那么重试可能是有意义的。我知道我们在某些地方这样做,它对于奇怪的临时故障很有效。我们确实记录了该事件,因为它确实应该很少见。

连接失败是生活的一部分,应该与连接超时不同地处理。

虽然您应该有一种理智的方式来处理“手头”失败的连接,但如果您不保持连接太久,那么您还可以查看 testOnBorrowtestOnReturn 属性的BasicDataSource。这些并不一定意味着在每个查询之前进行测试选择,除非您真的只是在每个查询之前收集一个句柄。

如果池中有很多连接,并且它们的使用频率不足以阻止超时,那么这确实是配置错误。编写代码来避免这种情况似乎有点落后。

【讨论】:

以上是关于如何正确处理连接空闲超时错误的主要内容,如果未能解决你的问题,请参考以下文章

如何正确处理 ZeroMQ.js 中的连接超时?

如何解决高并发,连接等待超时的异常

连接池异常:无法获取连接,池错误超时等待空闲对象

处理客户端与 openfire 服务器断开连接如果客户端空闲 5 分钟

(基本缩放)如果达到空闲超时,App Engine 是不是会关闭仍在忙于处理请求的应用?

如何在 reactor-netty 中配置池连接空闲超时