在我的网站上不活动一段时间后(使用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 question和linked bug,我不应该只设置autoReconnect = true。这是否意味着我必须在我做的任何查询中捕获此异常,然后重试该事务?这个逻辑应该在数据访问层还是模型层?是否有一种简单的方法来处理这个而不是包装每个查询以捕获它?
答案 0 :(得分:5)
我建议您使用连接池。它们可以提高性能,并可以处理低级细节,例如超时后重新连接等。
好的是c3p0,但还有其他人。 Spring有support for that,但我不知道所有的细节。 Here是Spring DataSource
的配置。
答案 1 :(得分:4)
此异常可能有两个原因:
您没有正确关闭JDBC资源。所有Connection
,Statement
和ResultSet
必须在finally
区块的try
区块中以相反的顺序关闭他们被收购了。这与您是否使用连接池无关。
您正在正确关闭JDBC资源,但使用设置较差的连接池。您需要确保连接池的连接打开时间不超过数据库配置的超时时间。在配置中减少一个或增加另一个。
答案 2 :(得分:3)
我们需要设置以下属性,以避免连接池的超时;我们使用Apache Commons DBCP。
<property name="validationQuery"> <value>SELECT 1</value> </property>
<property name="testOnBorrow"> <value>true</value> </property>