我有一个使用 Hibernate 连接到我的 MySQL 数据库的应用程序。我只是遇到了一个奇怪的超时问题。假设 MySQL 配置中的套接字超时设置为一小时。一个小时不活动后,套接字会按预期超时。问题是 Hibernate 似乎无法处理套接字超时,因为当 Hibernate 尝试进行数据库查询时,会抛出 SocketException。 hibernate 不是在内部处理异常,而是“死掉”并且无法以任何其他方式从异常中恢复,除非我手动构建一个新的 SessionFactory。
问题是,我怎样才能避免这个问题,这样我就不必手动跟踪超时?
编辑 您的建议似乎是正确的方法,但由于某种原因我无法让它发挥作用。我尝试按照 http://www.michaelstudman.com/fullfathomfive/articles/2004/06/07/mysql-dropping-connections-and-hibernate 上的说明进行操作以及 Jimmy 链接到的页面上的说明,但我仍然遇到相同的异常,因此我的应用程序失败了。可能与我将 mysql 的超时设置为 120 秒(仅用于测试目的)有关,但我将 c3p0 超时更改为 100 秒。
最佳答案
处理这些类型问题的最佳方法是配置连接池以在将连接分发给应用程序之前验证连接(无论是 hibernate 还是其他)。
大多数连接池允许您配置一个简单的查询,例如 mysql 的 SELECT 1=1
或 oracle 的 SELECT 1 FROM DUAL
。如果您使用的是 commons dbcp,则配置名称为 validateQuery
和 testOnBorrow
。
我实际上已经回答了一个类似的问题......关于这个问题的另一面,那就是对连接的验证太多了!
关于java - 套接字超时后 Hibernate 无法恢复,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1592864/