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

时间:2010-03-09 03:49:07

标签: java mysql spring jdbc database-connection

在我的网站上不活动一段时间后(使用Spring 2.5和MySql),我收到以下错误:

org.springframework.dao.RecoverableDataAccessException: The last packet sent successfully to the server was 52,847,830 milliseconds ago. is longer than the server configured value of 'wait_timeout'. You should consider either expiring and/or testing connection validity before use in your application, increasing the server configured values for client timeouts, or using the Connector/J connection property 'autoReconnect=true' to avoid this problem.

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

3 个答案:

答案 0 :(得分:5)

我建议您使用连接池。它们可以提高性能,并可以处理低级细节,例如超时后重新连接等。

好的是c3p0,但还有其他人。 Spring有support for that,但我不知道所有的细节。 Here是Spring DataSource的配置。

答案 1 :(得分:4)

此异常可能有两个原因:

  1. 您没有正确关闭JDBC资源。所有ConnectionStatementResultSet 必须finally区块的try区块中以相反的顺序关闭他们被收购了。这与您是否使用连接池无关。

  2. 您正在正确关闭JDBC资源,但使用设置较差的连接池。您需要确保连接池的连接打开时间不超过数据库配置的超时时间。在配置中减少一个或增加另一个。

答案 2 :(得分:3)

我们需要设置以下属性,以避免连接池的超时;我们使用Apache Commons DBCP。

<property name="validationQuery"> <value>SELECT 1</value>  </property>
<property name="testOnBorrow">    <value>true</value>      </property>