Spring Boot - Mysql Driver - JPA - 在服务器运行发布请求很长时间后显示无法打开 JPA EntityManager 进行事务处理

Posted

技术标签:

【中文标题】Spring Boot - Mysql Driver - JPA - 在服务器运行发布请求很长时间后显示无法打开 JPA EntityManager 进行事务处理【英文标题】:Spring Boot - Mysql Driver - JPA - After a long time that server is running a post request shows Could not open JPA EntityManager for transaction 【发布时间】:2018-01-06 01:15:02 【问题描述】:

我正在使用具有此配置的 SPRING BOOT 应用程序:

pom.xml

 <parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>1.5.4.RELEASE</version>
 </parent>
<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>6.0.6</version>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-jpa</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-mail</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-orm</artifactId>
    </dependency>
    <dependency>
        <groupId>org.thymeleaf</groupId>
        <artifactId>thymeleaf-spring4</artifactId>
    </dependency>
    <dependency>
        <groupId>com.google.guava</groupId>
        <artifactId>guava</artifactId>
        <version>22.0</version>
    </dependency>
</dependencies>
<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
    </plugins>   
</build>

我的 application.properties 有这些参数:

mysql.url=jdbc:mysql://localhost:3306/database?autoReconnect=true
mysql.username=root
mysql.password=root
mysql.driver-class-name=com.mysql.cj.jdbc.Driver

当我运行服务器时,它工作正常。没有什么问题。但是在 Spring Boot 服务器运行一段时间后,当我向任何 REST 服务发出 POST 请求消息时,我可以看到此消息:

100   908    0   897  100    11   1741     21 --:--:-- --:--:-- --:--:--  1853"timestamp":1501411130329,"status":500,"error":"Internal Server Error","exception":"java.lang.IllegalArgumentException","message":"org.springframework.transaction.CannotCreateTransactionException: Could not open JPA EntityManager for transaction; nested exception is javax.persistence.PersistenceException: com.mysql.cj.jdbc.exceptions.CommunicationsException: The last packet successfully received from the server was 295.677.715 milliseconds ago.  The last packet sent successfully to the server was 295.677.715 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.","path":"/get_last_user" 

我认为与 pom.xml 中定义的 MySQL 驱动程序和 MySQL 版本不兼容,但我不确定。

此应用程序在 DEBIAN 8 中运行。我不知道它是否相关,但我贡献了。

我不知道驱动程序是否可以是 com.mysql.jdbc.Driver 但它已被弃用。

提前致谢。

【问题讨论】:

【参考方案1】:

您的应用程序启动很长时间后,您的数据库连接可能会失败。如果您不希望出现此问题,则需要设置配置,以便应用程序自动重新启动其连接。

在您的 application.properties 中,添加以下内容:

spring.datasource.validationQuery=SELECT 1
spring.datasource.testOnBorrow=true
spring.datasource.max-active=10
spring.datasource.max-idle=5
spring.datasource.min-idle=5
spring.datasource.initial-size=3
spring.datasource.testWhileIdle=true
spring.datasource.max-wait=10000

【讨论】:

嗨@mar​​tin-choraine。它工作正常。我只是可以尝试一下。谢谢!!

以上是关于Spring Boot - Mysql Driver - JPA - 在服务器运行发布请求很长时间后显示无法打开 JPA EntityManager 进行事务处理的主要内容,如果未能解决你的问题,请参考以下文章

spring boot 多数据源

Spring Boot + MySQL + Docker Compose - 无法使 Spring Boot 连接到 MySQL

Spring boot??????????????????Spring boot??????MySql,Mybatis???PageHelper??????

Spring Boot 2.0:Docker Compose + Spring Boot + Nginx + Mysql 实践

spring boot mysql 事务

Spring Boot项目搭建(Spring Boot 2.2.4 + MyBatis + MySql)