1

在我的 Web 应用程序中,我使用的是 hibernate 和 spring。在 tomcat 服务器启动时, HibernateSessionFactory对象作为 spring bean 被注入。通常它工作正常。但是当我关闭甚至重新启动数据库时,问题就出现了。

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

在某种情况下,我怎样才能获得与数据库的新连接,这样我就不需要一次又一次地重新启动服务器。

4

2 回答 2

1

SessionFactory 重建对我有用

我们的应用程序正在使用 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();
于 2013-03-27T10:35:52.217 回答
0

This is not really Spring or Hibernate related. What you need to do is to setup your JDBC connection pool to test connections before returning them to whoever needs them (e.g. Hibernate). If the pool discovers that the connection in the pool is broken, it dicards it and tries another one from the pool. If all connections in the pool are broken, the pool will try to create new ones. Everything is transparent and your application won't even notice.

Which connection pool you use? In set validationQuery to"SELECT 1" nd consider setting: testOnBorrow=true, testOnReturn=true and testWhileIdle=true. For check out the documentation.

于 2012-04-21T15:48:36.100 回答