springboot+hikaricp 出现 Communications link failure The last packet successfully

springboot+hikaricp 管理mysql连接池出现以下错误:

2023-08-04 10:43:16.569 [xhx3-pool connection adder] ERROR c.z.h.p.HikariPool  498 createPoolEntry - xhx3-pool - Error thrown while acquiring connection from data source
com.mysql.cj.jdbc.exceptions.CommunicationsException: Communications link failure

The last packet successfully received from the server was 5,008 milliseconds ago. The last packet sent successfully to the server was 5,008 milliseconds ago.
    at com.mysql.cj.jdbc.exceptions.SQLError.createCommunicationsException(SQLError.java:174) ~[mysql-connector-java-8.0.25.jar!/:8.0.25]
    at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:64) ~[mysql-connector-java-8.0.25.jar!/:8.0.25]
    at com.mysql.cj.jdbc.ConnectionImpl.isReadOnly(ConnectionImpl.java:1419) ~[mysql-connector-java-8.0.25.jar!/:8.0.25]
    at com.mysql.cj.jdbc.ConnectionImpl.isReadOnly(ConnectionImpl.java:1404) ~[mysql-connector-java-8.0.25.jar!/:8.0.25]
    at com.zaxxer.hikari.pool.PoolBase.setupConnection(PoolBase.java:408) ~[HikariCP-4.0.3.jar!/:?]
    at com.zaxxer.hikari.pool.PoolBase.newConnection(PoolBase.java:369) ~[HikariCP-4.0.3.jar!/:?]
    at com.zaxxer.hikari.pool.PoolBase.newPoolEntry(PoolBase.java:206) ~[HikariCP-4.0.3.jar!/:?]
    at com.zaxxer.hikari.pool.HikariPool.createPoolEntry(HikariPool.java:476) ~[HikariCP-4.0.3.jar!/:?]
    at com.zaxxer.hikari.pool.HikariPool.access$100(HikariPool.java:71) ~[HikariCP-4.0.3.jar!/:?]
    at com.zaxxer.hikari.pool.HikariPool$PoolEntryCreator.call(HikariPool.java:726) ~[HikariCP-4.0.3.jar!/:?]
    at com.zaxxer.hikari.pool.HikariPool$PoolEntryCreator.call(HikariPool.java:712) ~[HikariCP-4.0.3.jar!/:?]
    at java.util.concurrent.FutureTask.run(FutureTask.java:266) ~[?:1.8.0_201]
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) ~[?:1.8.0_201]
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) ~[?:1.8.0_201]
    at java.lang.Thread.run(Thread.java:748) ~[?:1.8.0_201]
Caused by: com.mysql.cj.exceptions.CJCommunicationsException: Communications link failure

The last packet successfully received from the server was 5,008 milliseconds ago. The last packet sent successfully to the server was 5,008 milliseconds ago.
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) ~[?:1.8.0_201]
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) ~[?:1.8.0_201]
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) ~[?:1.8.0_201]
    at java.lang.reflect.Constructor.newInstance(Constructor.java:423) ~[?:1.8.0_201]
    at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:61) ~[mysql-connector-java-8.0.25.jar!/:8.0.25]
    at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:105) ~[mysql-connector-java-8.0.25.jar!/:8.0.25]
    at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:151) ~[mysql-connector-java-8.0.25.jar!/:8.0.25]
    at com.mysql.cj.exceptions.ExceptionFactory.createCommunicationsException(ExceptionFactory.java:167) ~[mysql-connector-java-8.0.25.jar!/:8.0.25]
    at com.mysql.cj.protocol.a.NativeProtocol.readMessage(NativeProtocol.java:546) ~[mysql-connector-java-8.0.25.jar!/:8.0.25]
    at com.mysql.cj.protocol.a.NativeProtocol.checkErrorMessage(NativeProtocol.java:710) ~[mysql-connector-java-8.0.25.jar!/:8.0.25]
    at com.mysql.cj.protocol.a.NativeProtocol.sendCommand(NativeProtocol.java:649) ~[mysql-connector-java-8.0.25.jar!/:8.0.25]
    at com.mysql.cj.protocol.a.NativeProtocol.sendCommand(NativeProtocol.java:136) ~[mysql-connector-java-8.0.25.jar!/:8.0.25]
    at com.mysql.cj.NativeSession.sendCommand(NativeSession.java:311) ~[mysql-connector-java-8.0.25.jar!/:8.0.25]
    at com.mysql.cj.NativeSession.queryServerVariable(NativeSession.java:1008) ~[mysql-connector-java-8.0.25.jar!/:8.0.25]
    at com.mysql.cj.jdbc.ConnectionImpl.isReadOnly(ConnectionImpl.java:1411) ~[mysql-connector-java-8.0.25.jar!/:8.0.25]
    ... 12 more
Caused by: java.net.SocketTimeoutException: Read timed out
    at java.net.SocketInputStream.socketRead0(Native Method) ~[?:1.8.0_201]
    at java.net.SocketInputStream.socketRead(SocketInputStream.java:116) ~[?:1.8.0_201]
    at java.net.SocketInputStream.read(SocketInputStream.java:171) ~[?:1.8.0_201]
    at java.net.SocketInputStream.read(SocketInputStream.java:141) ~[?:1.8.0_201]
    at com.mysql.cj.protocol.ReadAheadInputStream.fill(ReadAheadInputStream.java:107) ~[mysql-connector-java-8.0.25.jar!/:8.0.25]
    at com.mysql.cj.protocol.ReadAheadInputStream.readFromUnderlyingStreamIfNecessary(ReadAheadInputStream.java:150) ~[mysql-connector-java-8.0.25.jar!/:8.0.25]
    at com.mysql.cj.protocol.ReadAheadInputStream.read(ReadAheadInputStream.java:180) ~[mysql-connector-java-8.0.25.jar!/:8.0.25]
    at java.io.FilterInputStream.read(FilterInputStream.java:133) ~[?:1.8.0_201]
    at com.mysql.cj.protocol.FullReadInputStream.readFully(FullReadInputStream.java:64) ~[mysql-connector-java-8.0.25.jar!/:8.0.25]
    at com.mysql.cj.protocol.a.SimplePacketReader.readHeader(SimplePacketReader.java:63) ~[mysql-connector-java-8.0.25.jar!/:8.0.25]
    at com.mysql.cj.protocol.a.SimplePacketReader.readHeader(SimplePacketReader.java:45) ~[mysql-connector-java-8.0.25.jar!/:8.0.25]
    at com.mysql.cj.protocol.a.TimeTrackingPacketReader.readHeader(TimeTrackingPacketReader.java:52) ~[mysql-connector-java-8.0.25.jar!/:8.0.25]
    at com.mysql.cj.protocol.a.TimeTrackingPacketReader.readHeader(TimeTrackingPacketReader.java:41) ~[mysql-connector-java-8.0.25.jar!/:8.0.25]
    at com.mysql.cj.protocol.a.MultiPacketReader.readHeader(MultiPacketReader.java:54) ~[mysql-connector-java-8.0.25.jar!/:8.0.25]
    at com.mysql.cj.protocol.a.MultiPacketReader.readHeader(MultiPacketReader.java:44) ~[mysql-connector-java-8.0.25.jar!/:8.0.25]
    at com.mysql.cj.protocol.a.NativeProtocol.readMessage(NativeProtocol.java:540) ~[mysql-connector-java-8.0.25.jar!/:8.0.25]
    at com.mysql.cj.protocol.a.NativeProtocol.checkErrorMessage(NativeProtocol.java:710) ~[mysql-connector-java-8.0.25.jar!/:8.0.25]
    at com.mysql.cj.protocol.a.NativeProtocol.sendCommand(NativeProtocol.java:649) ~[mysql-connector-java-8.0.25.jar!/:8.0.25]
    at com.mysql.cj.protocol.a.NativeProtocol.sendCommand(NativeProtocol.java:136) ~[mysql-connector-java-8.0.25.jar!/:8.0.25]
    at com.mysql.cj.NativeSession.sendCommand(NativeSession.java:311) ~[mysql-connector-java-8.0.25.jar!/:8.0.25]
    at com.mysql.cj.NativeSession.queryServerVariable(NativeSession.java:1008) ~[mysql-connector-java-8.0.25.jar!/:8.0.25]
    at com.mysql.cj.jdbc.ConnectionImpl.isReadOnly(ConnectionImpl.java:1411) ~[mysql-connector-java-8.0.25.jar!/:8.0.25]
    ... 12 more

我的JAR包版本:
JDK:1.8
springboot:2.5.13
hikaricp:4.0.3
mysql-connector-java:8.0.25
mysql:8.0.25-15

我的springboot服务相关配置如下:

spring:
  application:
    name: XXXX
  datasource:
    xhx3:
      url: jdbc:mysql://XXX:XXXX/ledger3_lns?zeroDateTimeBehavior=convertToNull&useSSL=false&autoReconnect=true&characterEncoding=utf8
      username: XXXX
      password: XXXX
      driver-class-name: com.mysql.cj.jdbc.Driver
      type: com.zaxxer.hikari.HikariDataSource
      hikari:
        pool-name: xhx3-pool
        minimum-idle: 30
        maximum-pool-size: 30
        idle-timeout: 360000
        keepalive-time: 60000
        max-lifetime: 540000
        connection-timeout: 30000
        auto-commit: true
        read-only: true

mysql服务的wait_timeout配置如下:

+-------------------------------------+----------+
| Variable_name                       | Value    |
+-------------------------------------+----------+
| connect_timeout                     | 10       |
| delayed_insert_timeout              | 300      |
| have_statement_timeout              | YES      |
| innodb_flush_log_at_timeout         | 1        |
| innodb_lock_wait_timeout            | 10       |
| innodb_print_lock_wait_timeout_info | OFF      |
| innodb_rollback_on_timeout          | ON       |
| interactive_timeout                 | 600      |
| lock_wait_timeout                   | 3600     |
| mysqlx_connect_timeout              | 30       |
| mysqlx_idle_worker_thread_timeout   | 60       |
| mysqlx_interactive_timeout          | 28800    |
| mysqlx_port_open_timeout            | 0        |
| mysqlx_read_timeout                 | 30       |
| mysqlx_wait_timeout                 | 28800    |
| mysqlx_write_timeout                | 60       |
| net_read_timeout                    | 30       |
| net_write_timeout                   | 60       |
| rpl_stop_slave_timeout              | 31536000 |
| slave_net_timeout                   | 60       |
| thread_pool_idle_timeout            | 60       |
| wait_timeout                        | 600      |
+-------------------------------------+----------+

以上就是我的相关问题,目前异常是不定时就会出现一次,程序每天凌晨会有跑批任务查询数据库,数据库的QPS在2000左右,跑批SQL都是简单的查询没有写入操作,而且查询虽然有join查询但是使用的都是索引且join一张表;请各位帮忙看一下这个问题是我的配置有问题还是我的SQL有问题?感谢

写个main方法,用jdbc的方式获取数据库连接,看下是否正常。

看一下数据的链接信息以及数据库的驱动对不对,

img


试试同一版本的配置
具体
https://www.cnblogs.com/east7/p/14900555.html

【以下回答由 GPT 生成】

这个错误表示与数据库之间的通信链接中断了。下面是一些可能的解决方案:

  1. 检查数据库连接信息是否正确。 确保在配置文件中提供了正确的数据库连接信息,包括主机名、端口号、数据库名称、用户名和密码。确认这些信息是否与数据库服务器上的配置相匹配。

  2. 检查数据库服务器是否处于运行状态。 确保数据库服务器正在运行,并可以通过网络访问。可以尝试使用命令行工具(例如mysql命令)或GUI工具(例如phpMyAdmin)连接到数据库服务器,以验证服务器是否可用。

  3. 检查数据库服务器的防火墙设置。 确保数据库服务器的防火墙配置允许从应用程序部署的服务器上的端口访问数据库服务器。如果防火墙阻止了对数据库服务器的访问,则需要相应地配置防火墙规则。

  4. 检查网络连接是否稳定。 如果网络连接不稳定或出现丢包等问题,可能导致与数据库之间的通信中断。可以尝试使用其他设备或网络连接测试数据库连接。

  5. 检查数据库连接池配置。 确保Spring Boot应用程序的数据库连接池配置正确。可以查看application.propertiesapplication.yml文件中与数据库连接池相关的配置项,例如spring.datasource.urlspring.datasource.usernamespring.datasource.passwordspring.datasource.driver-class-name等。

下面是一个示例的Spring Boot配置文件,展示了与HikariCP连接池相关的必要配置项:

spring:
  datasource:
    url: jdbc:mysql://localhost:3306/mydatabase
    username: root
    password: mypassword
    driver-class-name: com.mysql.cj.jdbc.Driver
    hikari:
      connectionTimeout: 20000
      minimumIdle: 5
      maximumPoolSize: 30
      idleTimeout: 30000
      poolName: MyHikariCP

请根据实际情况检查并修改配置。

如果以上解决方案都无效,可能需要进一步分析错误日志以获取更详细的信息,并根据具体情况采取相应的措施。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^

🟢 这个报错是由于通信链路失败导致的,建议优化数据库查询,添加索引或者分批查询等方式来减少数据库的负载。

可以尝试调整连接池的配置参数,增加最大连接数、最小空闲连接数等。
同时,确保连接池的连接超时时间合理设置,避免连接长时间闲置导致连接失效

这个错误通常表示数据库连接失败。有几个可能的原因和解决方法:

  1. 确保数据库服务器正在运行,并且可以通过网络访问。可以尝试使用命令行或其他工具连接到数据库,以确保连接正常。

  2. 检查数据库连接配置是否正确。确保在Spring Boot的配置文件中正确配置了数据库的URL、用户名和密码。可以尝试使用硬编码的方式直接在代码中配置连接信息,以排除配置文件的问题。

  3. 检查数据库驱动程序是否正确加载。确保在项目的依赖管理中正确引入了数据库驱动程序,并且版本与数据库服务器兼容。

  4. 检查数据库连接池配置是否正确。如果使用HikariCP作为连接池,确保在配置文件中正确配置了连接池的相关参数,如最大连接数、最小空闲连接数等。

  5. 检查数据库服务器的连接数限制。有些数据库服务器默认限制了同时连接的客户端数量,如果超过了限制,就会出现连接失败的错误。可以尝试增加数据库服务器的连接数限制。

如果以上方法都没有解决问题,可以尝试查看数据库服务器的日志,以获取更详细的错误信息。另外,还可以尝试在代码中捕获异常,并打印出更详细的错误信息,以便进行排查。

在使用 SpringBoot 进行开发时,一些数据库连接池的框架是非常常见的,其中就包括 HikariCP。HikariCP 是一个非常高性能的 JDBC 连接池,它的特点是速度快、轻量级、易用性强,被广泛应用于各种应用程序。

然而,在使用 HikariCP 进行数据库连接时,经常会出现 "Communications link failure The last packet successfully" 的错误提示,这是一种常见的数据库连接异常。在本文中,我们将详细介绍这个错误的原因、解决方法以及一些注意事项。

一、错误原因

"Communications link failure The last packet successfully" 错误提示通常出现在以下两种情况:

  1. 数据库连接超时

在使用 HikariCP 进行数据库连接时,如果数据库连接超过了指定的时间,就会出现 "Communications link failure" 的错误提示。这是因为数据库连接超时后,连接就会断开,导致无法继续进行操作。

  1. 数据库连接丢失

在一些情况下,数据库连接会因为一些原因而被关闭,这时候也会出现 "Communications link failure" 的错误提示。

二、解决方法

针对上述两种情况,我们可以采取以下几种方法来解决 "Communications link failure The last packet successfully" 错误:

  1. 增加数据库连接池的大小

可以通过在 HikariCP 的配置文件中增加 maximum-pool-size 参数来增加数据库连接池的大小,这样可以避免因为连接池不足而导致的超时和连接丢失。

  1. 设置 keepalive

可以通过在 HikariCP 的配置文件中增加 keepalive 参数来设置连接的保持时间,这样可以避免因为连接空闲时间过长而被数据库服务器关闭连接。

  1. 修改数据库连接参数

可以通过在 HikariCP 的配置文件中修改连接参数来尝试解决连接超时和连接丢失的问题。比如,可以将连接超时时间增加到更长的时间,或者增加最大重试次数等。

  1. 查看数据库日志

可以通过查看数据库的日志,找到发生连接超时或连接丢失的原因。比如,可能是数据库服务器出现了故障,或者是网络连接出现了问题等。

  1. 升级数据库驱动程序

如果使用的数据库驱动程序版本过低,可能会出现连接超时或连接丢失的问题。可以尝试升级驱动程序到最新的版本,以解决这些问题。

  1. 优化程序逻辑

如果程序逻辑存在问题,可能会导致数据库连接超时或连接丢失。可以对程序进行优化,以减少数据库连接的使用次数,或者通过增加连接池大小等方法来优化程序逻辑。

三、注意事项

在使用 HikariCP 进行数据库连接时,需要注意以下几点:

  1. 在配置 HikariCP 时,需要根据实际情况设置连接池大小、连接超时时间等参数,以充分利用数据库资源。

  2. 在程序开发过程中,需要注意数据库连接的使用次数和关闭连接的操作,以避免连接池不足的问题。

  3. 如果出现 "Communications link failure The last packet successfully" 错误提示,应该及时查找并解决问题,以避免影响程序的正常运行。

  4. 在使用 HikariCP 时,需要定期维护数据库连接池和数据库服务器,以确保其正常运行。

总之,在使用 HikariCP 进行数据库连接时,需要综合考虑各种因素,并采取相应的措施来优化程序性能,并尽可能避免出现 "Communications link failure The last packet successfully" 的错误提示。

原因:jdbc连接失败

1仔细检查username、password、url中IP地址、端口号等是否正确,特别是IP地址更换环境容易忘记修改。
2数据库驱动时8.0以上版本 记得在yaml中这样配置:com.mysql.cj.jdbc.Driver