如何在数据库重启后从Hibernate SessionFactory获取新连接而不重新启动tomcat?

时间:2012-04-21 05:26:18

标签: spring hibernate

在我的网络应用程序中,我正在使用hibernate&弹簧。在tomcat服务器启动时,Hibernate SessionFactory对象将作为spring bean注入。通常它工作正常。但是当我关闭甚至重新启动数据库时会出现问题。

如果我从Hibernate SessionFactory对象检索会话并且想要执行查询,则重新启动数据库后,我将获得org.hibernate.exception.JDBCConectionException: Could not execute query exception。 要解决这个问题,我需要重启tomcat服务器。重新启动后,它会创建新的SessionFactory对象,所以我没有得到异常。

在某种情况下,如何与数据库建立新的全新连接,以便我不需要再次重新启动服务器。试。

2 个答案:

答案 0 :(得分:1)

SessionFactory rebuild为我工作

我们的应用程序使用的是tomcat,hibernate(3.5.1)和Oracle db(实际上有两个实例 - 一个是应用程序的主要部分,第二个是远程) 有时远程数据库重新启动,在每次调用发生异常后

JDBCConnectionException:could not execute query
Caused by: SQLRecoverableException: No more data to read from socket

我刚刚加入配置

hibernate.dbcp.validationQuery=select 1 from dual
hibernate.dbcp.testOnBorrow=true
hibernate.dbcp.testOnReturn=true

但没有结果。

然后我尝试关闭会话并重新创建它。 最后什么对我有用 - 在这个例子之后 sessionFactory重新创建

sessionFactory.close();
sessionFactory = annotationConfiguration.buildSessionFactory();

答案 1 :(得分:0)

这不是真正的Spring或Hibernate相关的。您需要做的是设置JDBC连接池以测试连接,然后将它们返回给任何需要它们的人(例如Hibernate)。如果池发现池中的连接已断开,则会对其进行标记并从池中尝试另一个连接。如果池中的所有连接都断开,则池将尝试创建新的连接。一切都是透明的,你的申请甚至都不会注意到。

您使用的是哪个连接池?在设置validationQuery"SELECT 1"并考虑设置:testOnBorrow=truetestOnReturn=truetestWhileIdle=true。对于,请查看documentation