java - 套接字超时后 Hibernate 无法恢复

标签 java mysql hibernate timeout

我有一个使用 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,则配置名称为 validateQuerytestOnBorrow

我实际上已经回答了一个类似的问题......关于这个问题的另一面,那就是对连接的验证太多了!

SELECT 1 from DUAL: MySQL

关于java - 套接字超时后 Hibernate 无法恢复,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1592864/

相关文章:

java.lang.ClassCastException : [Ljava. lang.Object;无法转换为 [Ljava.lang.Comparable;

php - Mysqli 显示一行中的表内容和未从数据库中检索到的列名

java - 对象需要时间才能在 hibernate 状态下持久化

java - 另一个@tx :annotation-driven causing autowired to fail for Junit Test

java - 如何让 Drools (Kie Session) 在 Netbeans Web 项目(无 Maven)中运行?

java - 用Java制作面向图形的rubix立方体求解器

MySQL 为空别名赋值

mysql - NodeJS Sequelize - 从刚刚在 MySQL 中创建的行中获取 ID?

java - 激活 Bean 验证集成时出错 - Hibernate

java - 从 IntelliJ 中的 sbt 控制台设置 JVM 堆大小