MySql超时 - 我在Spring应用程序中应该设置autoReconnect=true吗?

3

在我的网站(使用Spring 2.5和MySql)处于不活动状态一段时间后,我会遇到以下错误:

org.springframework.dao.RecoverableDataAccessException: 最后一个成功发送到服务器的数据包距离现在超过了 'wait_timeout' 配置值的 52,847,830 毫秒。您应该在使用之前考虑过期和/或测试连接的有效性,增加客户端超时的服务器配置值,或使用 Connector/J 连接属性 'autoReconnect=true' 来避免此问题。

根据这个问题相关的错误,我不能只设置 autoReconnect=true。那么这是否意味着我必须在任何查询中捕获此异常,然后重试事务?这个逻辑应该在数据访问层还是模型层中处理?有没有简单的方法来处理这个问题,而不是包装每个查询以捕获此异常?

3个回答

6
我建议您使用连接池而不是单独的连接。它们可以提高性能并且可以处理低级细节,例如超时后重新连接等问题。
一个好的选择是 c3p0,但还有其他选择。Spring 也有 相关支持,虽然我不知道所有的细节。这里 是 Spring 中 DataSource 的配置。

我在生产中使用c3p0已经有3年了,它非常棒。 - cherouvim
请问您能否告诉我如何使用application.properties配置文件编写相同的配置呢? - Marek

4
我们需要设置以下属性,以避免即使使用连接池也会超时;我们使用Apache Commons DBCP。
<property name="validationQuery"> <value>SELECT 1</value>  </property>
<property name="testOnBorrow">    <value>true</value>      </property>

4

这个异常可能有两个原因:

  1. 您没有正确关闭JDBC资源。无论您是否使用连接池,所有的 ConnectionStatementResultSet 都必须在获取它们的 try 块的 finally 块中以相反的顺序关闭。

  2. 您已经正确地关闭了JDBC资源,但是使用了设置不良的连接池。您需要确保连接池不会比数据库配置的超时时间更长地保持连接打开状态。在配置中减少一个或增加另一个。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接