【问题标题】:How to get a new Connection from Hibernate SessionFactory after the DB restart without restarting the tomcat?DB重启后如何从Hibernate SessionFactory获得新的连接而不重启tomcat?
【发布时间】:2012-04-21 05:26:17
【问题描述】:

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

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

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

【问题讨论】:

    标签: spring hibernate


    【解决方案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();
    

    【讨论】:

    • 请详细解释您的答案。
    【解决方案2】:

    这实际上与 Spring 或 Hibernate 无关。您需要做的是设置 JDBC 连接池以测试连接,然后再将它们返回给需要它们的人(例如 Hibernate)。如果池发现池中的连接已断开,则将其丢弃并尝试池中的另一个连接。如果池中的所有连接都断开,则池将尝试创建新连接。一切都是透明的,您的应用程序甚至都不会注意到。

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

    【讨论】:

      猜你喜欢
      • 2012-12-08
      • 2015-12-23
      • 1970-01-01
      • 2013-08-09
      • 2012-02-05
      • 2018-06-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多