当前位置: 首页 > 面试题库 >

在Spring-boot JPA休眠中> 4 <24之后连接到Db的管芯

苏鸿波
2023-03-14
问题内容

我有一个使用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

但是我检查了不建议这样做。因此有人可以建议我该怎么做才能克服此错误


问题答案:

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

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

当您有活动的连接并且在事务期间发生某些事情并且将要进行重新连接时,这可能会产生问题。在事务开始时验证连接并在开始时获取新的连接时,它不会出现问题。

但是,最好在应用程序的生命周期内启用连接验证。为此,您可以指定几个属性。

首先从指定允许该池的最大连接数开始。(有关确定最大池大小的信息,请阅读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

现在,您还可以验证连接空闲时的状态,您需要指定要多久一次对连接运行此查询以及何时将连接视为空闲。

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连接池这是一个很好的读什么,以及如何配置的。



 类似资料:
  • 问题内容: 我有一个Hibernate的服务方法,例如:。securityId2由用户传递。每个SecurityContact与一个Contact有多对一的关系,因此Hibernate在运行此查询时会自动调用联接。但是,Hibernate始终运行的联接是内部联接,因此无法正常运行。有没有办法强迫Hibernate在内部生成左外部联接?这是SecurityContact类的代码: 问题答案: 尝试多

  • 问题内容: 如何在Hibernate中编写此SQL查询?我想使用Hibernate创建查询,而不是创建数据库。 我在SQLServer2008中创建了实体类, 我试图以多种方式构建有效的选择查询,但仍然无法正常工作。 实体有问题吗? 问题答案: 仅当实体之间存在关联时才能使用联接。您的Employee实体不应将名称为,类型为的字段映射到列。它应该与Team实体具有ManyToOne关联,并映射为J

  • 问题内容: 在我的应用程序中,我使用了hibernate-core-4.1.8 jar,并希望将ehCache用作第二级缓存。我当前使用的jar是ehcache- core-2.5.0。我将其放置在WebContetn / WEB-INF / lib文件夹中,并将其放置在类路径中。 我的hibernate.cfg.xml看起来像这样: 放置在JavaResources / src文件夹中的ehca

  • 问题内容: 我有一个Spring和Hibernate3在生产中运行良好的应用程序。以下是Spring的applicationContext.xml中会话工厂的配置 生产正常。 现在,对于另一个项目,我们正在迁移到Hibernate4。我们使用org.springframework.orm.hibernate4。*包中的Hibernate 4的SessionFactory,TransacionMan

  • 问题内容: 在我的Java进程中,我使用以下spring配置连接到MySql: Entity-Manager通过容器注入到数据访问层: 并且我的公共业务逻辑方法带有注释。 据我了解,容器负责确保一旦交易完成,实体管理器将连接返回到池(在我的情况下为HikariCP),但是我没有找到任何描述连接管理方式的官方文档。有人可以给我解释一下,还是可以提供很好的参考资料来说明使用这种配置时何时将确切的连接返

  • 问题内容: 在引发约束违规异常之后,有什么方法可以继续使用线程绑定的hibernate会话吗?我在这里举一个简短的例子: 从现在开始,hibernate会话完全没有用,即使对于只读操作,例如使用OpenSessionInView模式在视图中呈现惰性集合。 问题答案: Session的文档指出, 如果Session引发异常,则必须回滚事务并丢弃会话。 发生异常后,会话的内部状态可能与数据库不一致。。