-HikaricP - Failed to validate connection com.mysql.cj.jdbc.connectionImpl@60k7570bI (No operations allowed after connection closed.). Possibly consider using a shorter maxlifetime value
遇到错误信息 “-HikaricP - Failed to validate connection com.mysql.cj.jdbc.connectionImpl@60k7570bI (No operations allowed after connection closed.)” 通常表明你的数据库连接池(在这个例子中是 HikariCP)中的某个连接在尝试使用时已经被关闭了。
这种情况可能由几个不同的原因引起:
- 连接超时:
数据库连接可能因为长时间未使用而被数据库服务器或中间件(如防火墙、负载均衡器等)关闭。
HikariCP 的 maxLifetime 属性定义了连接在池中存活的最长时间。如果设置得太长,连接可能会因为外部因素(如数据库服务器的超时设置)而失效,但 HikariCP 还未将其从池中移除。 - 数据库服务器设置:
数据库服务器可能有自己的连接超时设置,这可能会比 HikariCP 的 maxLifetime 更短。
如果数据库服务器的连接空闲时间超过了其设置的超时时间,那么即使 HikariCP 还未将该连接视为过期,数据库服务器也会关闭该连接。
解决方案
-
调整 HikariCP 的 maxLifetime:
将 maxLifetime 设置为一个比数据库服务器连接超时时间稍短的值。这可以确保 HikariCP 在数据库服务器关闭连接之前将其从池中移除。
例如,如果数据库服务器的超时时间是 8 小时,你可以将 HikariCP 的 maxLifetime 设置为 7 小时。 -
检查数据库服务器的连接超时设置:
确认数据库服务器的连接超时设置,并确保 HikariCP 的 maxLifetime 不会超过这个值。
查看连接超时时间,可以使用以下SQL语句SHOW VARIABLES LIKE 'connect_timeout';
默认情况下,connect_timeout的值为10秒,但可以根据需要进行调整。
假设你希望将连接超时时间修改为20秒,可以使用以下SQL语句:SET GLOBAL connect_timeout = 20;
项目https://gitee.com/dromara/RuoYi-Cloud-Plus/tree/master/中datasource.yml配置如下
spring:
datasource:
type: com.zaxxer.hikari.HikariDataSource
# 动态数据源文档 https://www.kancloud.cn/tracy5546/dynamic-datasource/content
dynamic:
# 性能分析插件(有性能损耗 不建议生产环境使用)
p6spy: true
# 开启seata代理,开启后默认每个数据源都代理,如果某个不需要代理可单独关闭
seata: true
# 严格模式 匹配不到数据源则报错
strict: true
hikari:
# 最大连接池数量
maxPoolSize: 20
# 最小空闲线程数量
minIdle: 10
# 配置获取连接等待超时的时间
connectionTimeout: 30000
# 校验超时时间
validationTimeout: 5000
# 空闲连接存活最大时间,默认10分钟
idleTimeout: 600000
# 此属性控制池中连接的最长生命周期,值0表示无限生命周期,默认30分钟
maxLifetime: 1800000
# 多久检查一次连接的活性
keepaliveTime: 30000
尝试调整maxLifetime
值为8000