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的方式获取数据库连接,看下是否正常。
看一下数据的链接信息以及数据库的驱动对不对,
【以下回答由 GPT 生成】
这个错误表示与数据库之间的通信链接中断了。下面是一些可能的解决方案:
检查数据库连接信息是否正确。 确保在配置文件中提供了正确的数据库连接信息,包括主机名、端口号、数据库名称、用户名和密码。确认这些信息是否与数据库服务器上的配置相匹配。
检查数据库服务器是否处于运行状态。 确保数据库服务器正在运行,并可以通过网络访问。可以尝试使用命令行工具(例如mysql
命令)或GUI工具(例如phpMyAdmin)连接到数据库服务器,以验证服务器是否可用。
检查数据库服务器的防火墙设置。 确保数据库服务器的防火墙配置允许从应用程序部署的服务器上的端口访问数据库服务器。如果防火墙阻止了对数据库服务器的访问,则需要相应地配置防火墙规则。
检查网络连接是否稳定。 如果网络连接不稳定或出现丢包等问题,可能导致与数据库之间的通信中断。可以尝试使用其他设备或网络连接测试数据库连接。
检查数据库连接池配置。 确保Spring Boot应用程序的数据库连接池配置正确。可以查看application.properties
或application.yml
文件中与数据库连接池相关的配置项,例如spring.datasource.url
、spring.datasource.username
、spring.datasource.password
、spring.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
请根据实际情况检查并修改配置。
如果以上解决方案都无效,可能需要进一步分析错误日志以获取更详细的信息,并根据具体情况采取相应的措施。
🟢 这个报错是由于通信链路失败导致的,建议优化数据库查询,添加索引或者分批查询等方式来减少数据库的负载。
可以尝试调整连接池的配置参数,增加最大连接数、最小空闲连接数等。
同时,确保连接池的连接超时时间合理设置,避免连接长时间闲置导致连接失效
这个错误通常表示数据库连接失败。有几个可能的原因和解决方法:
确保数据库服务器正在运行,并且可以通过网络访问。可以尝试使用命令行或其他工具连接到数据库,以确保连接正常。
检查数据库连接配置是否正确。确保在Spring Boot的配置文件中正确配置了数据库的URL、用户名和密码。可以尝试使用硬编码的方式直接在代码中配置连接信息,以排除配置文件的问题。
检查数据库驱动程序是否正确加载。确保在项目的依赖管理中正确引入了数据库驱动程序,并且版本与数据库服务器兼容。
检查数据库连接池配置是否正确。如果使用HikariCP作为连接池,确保在配置文件中正确配置了连接池的相关参数,如最大连接数、最小空闲连接数等。
检查数据库服务器的连接数限制。有些数据库服务器默认限制了同时连接的客户端数量,如果超过了限制,就会出现连接失败的错误。可以尝试增加数据库服务器的连接数限制。
如果以上方法都没有解决问题,可以尝试查看数据库服务器的日志,以获取更详细的错误信息。另外,还可以尝试在代码中捕获异常,并打印出更详细的错误信息,以便进行排查。
在使用 SpringBoot 进行开发时,一些数据库连接池的框架是非常常见的,其中就包括 HikariCP。HikariCP 是一个非常高性能的 JDBC 连接池,它的特点是速度快、轻量级、易用性强,被广泛应用于各种应用程序。
然而,在使用 HikariCP 进行数据库连接时,经常会出现 "Communications link failure The last packet successfully" 的错误提示,这是一种常见的数据库连接异常。在本文中,我们将详细介绍这个错误的原因、解决方法以及一些注意事项。
一、错误原因
"Communications link failure The last packet successfully" 错误提示通常出现在以下两种情况:
在使用 HikariCP 进行数据库连接时,如果数据库连接超过了指定的时间,就会出现 "Communications link failure" 的错误提示。这是因为数据库连接超时后,连接就会断开,导致无法继续进行操作。
在一些情况下,数据库连接会因为一些原因而被关闭,这时候也会出现 "Communications link failure" 的错误提示。
二、解决方法
针对上述两种情况,我们可以采取以下几种方法来解决 "Communications link failure The last packet successfully" 错误:
可以通过在 HikariCP 的配置文件中增加 maximum-pool-size 参数来增加数据库连接池的大小,这样可以避免因为连接池不足而导致的超时和连接丢失。
可以通过在 HikariCP 的配置文件中增加 keepalive 参数来设置连接的保持时间,这样可以避免因为连接空闲时间过长而被数据库服务器关闭连接。
可以通过在 HikariCP 的配置文件中修改连接参数来尝试解决连接超时和连接丢失的问题。比如,可以将连接超时时间增加到更长的时间,或者增加最大重试次数等。
可以通过查看数据库的日志,找到发生连接超时或连接丢失的原因。比如,可能是数据库服务器出现了故障,或者是网络连接出现了问题等。
如果使用的数据库驱动程序版本过低,可能会出现连接超时或连接丢失的问题。可以尝试升级驱动程序到最新的版本,以解决这些问题。
如果程序逻辑存在问题,可能会导致数据库连接超时或连接丢失。可以对程序进行优化,以减少数据库连接的使用次数,或者通过增加连接池大小等方法来优化程序逻辑。
三、注意事项
在使用 HikariCP 进行数据库连接时,需要注意以下几点:
在配置 HikariCP 时,需要根据实际情况设置连接池大小、连接超时时间等参数,以充分利用数据库资源。
在程序开发过程中,需要注意数据库连接的使用次数和关闭连接的操作,以避免连接池不足的问题。
如果出现 "Communications link failure The last packet successfully" 错误提示,应该及时查找并解决问题,以避免影响程序的正常运行。
在使用 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