【问题标题】:Spring Boot application MySQL SocketTimeoutExceptionSpring Boot 应用程序 MySQL SocketTimeoutException
【发布时间】:2019-07-29 11:37:22
【问题描述】:

我有一个使用 Spring Boot 的应用程序,它作为守护进程运行,每 24 小时执行一次处理,其中使用 MySQL。我昨天发布了它,今天它第一次尝试执行处理,但不幸的是我收到了以下错误(相关的堆栈跟踪段):

08:00:31.264 [pool-1-thread-1] ERROR com.zaxxer.hikari.pool.HikariPool - HikariPool-1 - Exception during pool initialization.
com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure
...
Caused by: org.springframework.jdbc.CannotGetJdbcConnectionException: Failed to obtain JDBC Connection; nested exception is com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure
...
Caused by: java.net.SocketTimeoutException: connect timed out

我当时怀疑 MySQL 有什么问题,我更倾向于连接可能是陈旧的,尽管我认为连接池应该处理它。

有没有人遇到过这样的情况并能够解决。请让我知道我应该发布哪些其他相关信息。这是我的application.properties,当然没有安全信息:

spring.datasource.url=jdbc:mysql://<server>:3306/<schema>?characterEncoding=UTF-8&useUnicode=true
spring.datasource.username=<username>
spring.datasource.password=<password>
spring.datasource.driver-class-name=com.mysql.jdbc.Driver

pom.xml的相关内容:

... 
<properties>
    ...
    <mysql-connector-java.version>5.1.38</mysql-connector-java.version>
    <spring.boot.version>2.1.3.RELEASE</spring.boot.version>
    ...
</properties>

<dependencies>
    ...
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-jdbc</artifactId>
    </dependency>
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>${mysql-connector-java.version}</version>
    </dependency>
    ...
</dependencies>
...

应用程序使用 Spring Boot 提供的JdbcTemplate

【问题讨论】:

    标签: mysql spring-boot


    【解决方案1】:

    1)由于创建的数据库连接不活动而发生

    为了避免它,你可以添加以下属性 应用程序.properties。

    spring.datasource.testWhileIdle = true
    spring.datasource.timeBetweenEvictionRunsMillis = 60000
    spring.datasource.validationQuery = SELECT 1
    

    这将通过简单地触发 SELECT 1 查询来结束活动。

    【讨论】:

      猜你喜欢
      • 2018-06-16
      • 2019-01-02
      • 1970-01-01
      • 2014-08-22
      • 2019-08-31
      • 2016-03-08
      • 2020-12-21
      • 2015-03-25
      • 2018-01-10
      相关资源
      最近更新 更多