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

时间:2011-10-18 14:24:14

标签: java mysql spring connection-timeout communicationexception

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

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

有时当连接长时间处于空闲状态时,会抛出CommunicationException并显示以下消息:

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

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

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

我考虑过捕获CommunicationException并重试直到成功,如果失败超过X次,则抛出一个异常,显示重试X次失败。

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

任何信息都将不胜感激。

谢谢!

1 个答案:

答案 0 :(得分:1)

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

连接失败是生活的一部分,应该以不同的方式处理连接超时

虽然您应该有一种理智的方式来处理您“手头”失败的连接,但如果您没有长时间保持连接,那么您还可以查看testOnBorrow和{{ 1}} testOnReturn的属性。这些并不一定意味着在每个查询之前进行测试选择,除非您确实只是在每个查询之前收集句柄。

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