如何解决JavaHibernate与数据库的连接超时?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (1)
  • 关注 (0)
  • 查看 (270)

几分钟后Hibernate失去与数据库的连接并发送此类错误:

org.hibernate.engine.jdbc.spi.SqlExceptionHelper logExceptions WARN: SQL错误:0,SQLState:08S01paź18,2018811:17:40 PM org.hibernate.engine.jdbc.spi.SqlExceptionHelper logExceptions错误: 从服务器成功收到的最后一个数据包是363 452毫秒前。成功发送到服务器的最后一个数据包是363 493毫秒前。比服务器配置的'interactive_timeout'值长。您应该考虑在应用程序中使用之前到期和/或测试连接有效性,增加服务器配置的客户端超时值,或使用Connector / J连接属性“autoReconnect = true”来避免此问题。

我添加了autoreconnect = true但它没有工作,错误仍然发生。

然后我创建了DatabaseConnectionController,它具有以下功能:

public static EntityManagerFactory getEntityManagerFactory() {

    if (entityManagerFactory != null && entityManagerFactory.isOpen()) {
        return entityManagerFactory;
    } else {
        return requestNewConnection();
    }
}

问题仍然存在,我开始在谷歌中搜索答案,我在persistance.xml中添加了几行:

<property name="hibernate.dbcp.validationQuery" value="SELECT 1" />
<property name="hibernate.dbcp.testOnBorrow" value="true" />
<property name="hibernate.dbcp.validationInterval" value="60000" />
<property name="hibernate.dbcp.testOnReturn" value="true" />

它也没有解决我的问题。

Hibernate在第一次发送错误消息时不会自动重新连接到数据库,但是当它被发送时,第二个查询会自动重新连接到数据库。

如何在断开连接后将其设置为自动重新连接,或者如何捕获此错误并在代码中重复查询?

提问于
用户回答回答于

问题是数据库将丢弃空闲连接。连接空闲多长时间取决于数据库的配置。为了解决这个问题,您需要使用连接池,例如c3p0。要使用它需要在Maven中添加以下依赖项。

<!-- c3p0 -->
<!-- Session manager -->
<!-- Check that the version works for you -->
<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-c3p0</artifactId>
    <version>5.2.12.Final</version>
</dependency>

然后需要将以下配置添加到您的hibernate.cfg.xml中。

<!-- c3p0 -->
<property name="hibernate.c3p0.acquire_increment">1</property>
<property name="hibernate.c3p0.idle_test_period">300</property>
<property name="hibernate.c3p0.timeout">600</property>
<property name="hibernate.c3p0.max_size">25</property>
<property name="hibernate.c3p0.min_size">1</property>
<property name="hibernate.c3p0.max_statement">0</property>
<property name="hibernate.c3p0.acquireRetryAttempts">1</property>
<property name="hibernate.c3p0.acquireRetryDelay">250</property>

这应该足以继续创建新连接并解决连接问题

所属标签

可能回答问题的人

  • 人生的旅途

    10 粉丝484 提问6 回答
  • 不吃貓的鱼oo

    5 粉丝466 提问6 回答
  • 富有想象力的人

    4 粉丝0 提问5 回答
  • Richel

    8 粉丝0 提问5 回答

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励