在我的网络应用程序中,我正在使用hibernate&弹簧。在tomcat服务器启动时,Hibernate SessionFactory
对象将作为spring bean注入。通常它工作正常。但是当我关闭甚至重新启动数据库时会出现问题。
如果我从Hibernate SessionFactory
对象检索会话并且想要执行查询,则重新启动数据库后,我将获得org.hibernate.exception.JDBCConectionException: Could not execute query exception
。
要解决这个问题,我需要重启tomcat服务器。重新启动后,它会创建新的SessionFactory
对象,所以我没有得到异常。
在某种情况下,如何与数据库建立新的全新连接,以便我不需要再次重新启动服务器。试。
答案 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)。如果池发现池中的连接已断开,则会对其进行标记并从池中尝试另一个连接。如果池中的所有连接都断开,则池将尝试创建新的连接。一切都是透明的,你的申请甚至都不会注意到。
您使用的是哪个连接池?在dbcp设置validationQuery
至"SELECT 1"
并考虑设置:testOnBorrow=true
,testOnReturn=true
和testWhileIdle=true
。对于c3p0,请查看documentation。