套接字超时后,Hibernate无法恢复

时间:2009-10-20 06:50:22

标签: java mysql hibernate timeout

我有一个使用Hibernate连接到MySQL数据库的应用程序。我只是有一个奇怪的超时问题。假设MySQL配置中的套接字超时设置为一小时。在一小时不活动后,套接字按预期超时。问题是Hibernate似乎无法处理套接字超时,因为当Hibernate尝试进行数据库查询时,会抛出SocketException。除了在内部处理异常之外,hibernate只是“死”并且无法通过任何其他方式从异常中恢复,而不是手动构建新的SessionFactory。

问题是,如何避免这个问题,以便我不必手动跟踪超时?

EDIT 您的建议似乎是正确的方法,但由于某种原因,我无法让它发挥作用。我尝试按照http://www.michaelstudman.com/fullfathomfive/articles/2004/06/07/mysql-dropping-connections-and-hibernate上的说明和Jimmy链接的页面上的说明进行操作,但我仍然遇到相同的异常,我的应用程序因此而失败。可能有事要做,我将mysql的超时设置为120秒(仅用于测试目的),但我将c3p0超时更改为100秒。

2 个答案:

答案 0 :(得分:3)

处理这些类型问题的最佳方法是配置连接池,以便在将连接分发给应用程序之前验证连接(无论是休眠还是休眠)。

大多数连接池允许您为mysql中的SELECT 1=1或oracle中的SELECT 1 FROM DUAL配置简单查询。如果您使用commons dbcp,则配置名称为validateQuerytestOnBorrow

我实际上回答了一个类似的问题......与此问题的另一面有关,而且对连接的验证太多了!

SELECT 1 from DUAL: MySQL

答案 1 :(得分:2)

有关此问题的一些好消息,请查看here。在坚果壳中,您可以使用类似

的设置来获取连接池以检查过时的连接
c3p0.testConnectionOnCheckout=true