几分钟后,Hibernate断开与数据库的连接,并发送这样的错误:
org.hibernate.engine.jdbc.spi.SqlExceptionHelper logExceptions警告:
SQL错误:0,SQLState:08S01paź18,2018 11:17:40 PM
org.hibernate.engine.jdbc.spi.SqlExceptionHelper logExceptions错误:
从服务器成功接收到的最后一个数据包是363452 毫秒前。成功发送到服务器的最后一个数据包是 363毫秒前超过服务器配置值 的“ 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在第一次发送错误消息时不会自动重新连接到数据库,但是在发送第二个查询时,它会自动重新连接到数据库。
如何设置断开连接后自动重新连接,或者如何捕获此错误并在代码中重复查询?
答案 0 :(得分:0)
问题在于数据库将删除空闲连接。连接空闲多少时间取决于数据库的配置。为了解决这个问题,您需要使用连接池,例如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>
这足以继续创建新连接并解决您的连接问题。