java - 在 spring-boot jpa hibernate 中 >4<24 后与 Db 的连接终止

标签 java mysql jpa spring-boot

我有一个使用 spring-boot,jpa-hiberate 和 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 .所以任何人都可以建议我应该怎么做来克服这个错误

最佳答案

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

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

当您有 Activity 连接并且在事务期间发生某些事情并且将要重新连接时,这可能会出现问题。如果在事务开始时验证连接并在开始时获取新连接,则不会出现问题。

但是,在应用程序的生命周期内启用连接验证可能会更好。为此,您可以指定 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,因为 JDBC4 具有更好/不同的连接验证方式。 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很好地了解了配置的内容和方法。

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

关于java - 在 spring-boot jpa hibernate 中 >4<24 后与 Db 的连接终止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30451470/

相关文章:

mysql - 计算多个表中每个 ID 的行数

java - Hibernate 在异步 EJB 应用程序中的奇怪行为。竞赛条件?

mysql - 如何在 JPA 中创建这个 native 查询?

java - 哪个 jar 文件包含 jersey LoggingFeature 类?

java - 在 1 个 JPanel 中绘制 2 个图像

mysql - WHERE 内的 IF 条件

java - 由 : org. hibernate.AnnotationException: mappedBy 引用未知目标实体属性引起

java - 自动从一个对象类转换到另一个对象类

java - java比较2个字符串是否包含相同的单词

mysql - 数据未添加到 MySQL 服务