【问题标题】:Java Hibernate connection to database timed out after few minutesJava Hibernate 与数据库的连接在几分钟后超时
【发布时间】:2018-10-18 21:41:31
【问题描述】:

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

org.hibernate.engine.jdbc.spi.SqlExceptionHelper logExceptions 警告:

SQL 错误:0,SQLState:08S01 paź 18, 2018 晚上 11:17:40

org.hibernate.engine.jdbc.spi.SqlExceptionHelper logExceptions 错误:

从服务器成功收到的最后一个数据包是 363 452 毫秒前。最后一个成功发送到服务器的数据包是 363 493 毫秒前。比服务器配置的值长 'interactive_timeout'。您应该考虑到期和/或 在您的应用程序中使用之前测试连接有效性,增加 服务器为客户端超时配置值,或使用 连接器/J 连接属性 'autoReconnect=true' 以避免这种情况 问题。

我添加了 autoreconnect=true 但它不起作用,错误仍然发生。

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

public static EntityManagerFactory getEntityManagerFactory() {

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

问题依旧,我开始在google中搜索答案,我在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 在第一次发送错误消息时不会自动重新连接到数据库,但是在发送第二次查询时会自动重新连接到数据库。

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

【问题讨论】:

    标签: java mysql hibernate connection


    【解决方案1】:

    问题是数据库会丢弃空闲连接。连接空闲多长时间取决于您的数据库配置。为了解决这个问题,您需要使用连接池,例如 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>
    

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

    【讨论】:

      猜你喜欢
      • 2015-11-15
      • 2018-09-20
      • 1970-01-01
      • 1970-01-01
      • 2020-10-01
      • 1970-01-01
      • 2018-12-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多