Java 休眠与数据库的连接在几分钟后超时



休眠在几分钟后失去与数据库的连接,并发送如下错误:

org.hibernate.engine.jdbc.spi.SqlExceptionHelper logExceptions WARN:

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

org.hibernate.engine.jdbc.spi.SqlExceptionHelper logExceptions ERROR:

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

我添加了自动重新连接=true,但它不起作用,并且仍然发生错误。

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

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

问题仍然出现,我开始在谷歌中搜索答案,我添加了几行持久性.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>

然后,您需要将以下配置添加到休眠.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>

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

最新更新