我正在使用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次失败。
任何信息都将不胜感激。
谢谢!
答案 0 :(得分:1)
如果您的查询可以重新启动,那么重试可能是有意义的。我知道我们在某些地方这样做,它可以解决奇怪的,暂时的故障。我们确实记录了这个事件,因为它真的很少见。
连接失败是生活的一部分,应该以不同的方式处理连接超时。
虽然您应该有一种理智的方式来处理您“手头”失败的连接,但如果您没有长时间保持连接,那么您还可以查看testOnBorrow
和{{ 1}} testOnReturn
的属性。这些并不一定意味着在每个查询之前进行测试选择,除非您确实只是在每个查询之前收集句柄。
如果池上有很多连接,并且它们的使用频率不足以阻止超时,那么它确实是一个配置错误。编写代码以避免这种情况似乎有些落后。