在Spring引导jpa休眠中>4〈24之后,与Db的连接断开

d8tt03nd  于 2023-01-13  发布在  Spring
关注(0)|答案(1)|浏览(130)

我有一个应用程序,使用spring-boot,jpa-hiberanate与mysql.我得到这个错误日志

Caused by: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: The last packet successfully received from the server was 56,006,037 milliseconds ago.  The last packet sent successfully to the server was 56,006,037 milliseconds ago. is longer than the server configured value of 'wait_timeout'. You should consider either expiring and/or testing connection validity before use in your application, increasing the server configured values for client timeouts, or using the Connector/J connection property 'autoReconnect=true' to avoid this problem.

这是我的application.properties

# DataSource settings: set here configurations for the database connection
spring.datasource.url = jdbc:mysql://localhost:3306/test
spring.datasource.username = test
spring.datasource.password = test
spring.datasource.driverClassName = com.mysql.jdbc.Driver

# Specify the DBMS
spring.jpa.database = MYSQL

# Show or not log for each sql query
spring.jpa.show-sql = true

# Hibernate settings are prefixed with spring.jpa.hibernate.*
spring.jpa.hibernate.ddl-auto = update
spring.jpa.hibernate.dialect = org.hibernate.dialect.MySQL5Dialect
spring.jpa.hibernate.naming_strategy = org.hibernate.cfg.ImprovedNamingStrategy

要解决此问题,我可以使用

spring.datasource.testOnBorrow=true
spring.datasource.validationQuery=SELECT 1

但是我检查了它不是recommended。那么谁能建议我应该做些什么来克服这个错误

rdlzhqv9

rdlzhqv91#

最简单的方法是在JDBC url中指定autoReconnect属性,尽管这不是推荐的方法。

spring.datasource.url = jdbc:mysql://localhost:3306/test?autoReconnect=true

当您具有活动连接时,在事务处理期间发生了一些事情并将进行重新连接时,这可能会给予问题。如果在事务处理开始时验证连接并在开始时获取新连接,则不会出现问题。
然而,在应用程序的生命周期内启用连接验证可能更好,为此,可以指定several properties
首先,指定池允许的最大连接数(有关确定最大池大小的内容,请阅读this)。

spring.datasource.max-active=10

您可能还需要指定初始连接数

spring.datasource.initial-size=5

接下来,您需要指定空闲连接的最小和最大数量。

spring.datasource.max-idle=5
spring.datasource.min-idle=1

要验证连接,您需要指定验证查询和验证时间。因为您希望定期验证,而不是在从池中检索连接时验证(这是为了防止池中的连接断开)。

spring.datasource.test-while-idle=true
spring.datasource.test-on-borrow=true
spring.datasource.validation-query=SELECT 1

**注意:**实际上不鼓励使用validation-query,因为JDBC 4有更好/不同的连接验证方法。HikariCP将在可用时自动调用JDBC验证方法。

既然您还在连接空闲时进行验证,那么您需要指定希望为连接运行此查询的频率以及连接被视为空闲的时间。

spring.datasource.time-between-eviction-runs-millis=5000 (this is the default)
spring.datasource.min-evictable-idle-time-millis=60000 (this is also default)

所有这些都应该触发对您的(空闲)连接的验证,并且当异常发生或空闲期结束时,您的连接将从池中删除。
假设您正在使用Tomcat JDBC作为连接池this,这是一个很好的关于配置什么和如何配置的读物。

**更新:**Sping Boot 2.x将默认连接池切换为HikariCP,而不是Tomcat JDBC。

相关问题