无法验证连接(此连接已关闭。)。可能考虑使用更短的 maxLifetime 值
Posted
技术标签:
【中文标题】无法验证连接(此连接已关闭。)。可能考虑使用更短的 maxLifetime 值【英文标题】:Failed to validate connection (This connection has been closed.). Possibly consider using a shorter maxLifetime value 【发布时间】:2020-06-03 15:52:29 【问题描述】: HikariPool-1 - 无法验证连接 org.postgresql.jdbc.PgConnection@f162126(此连接已 关闭。)。可能考虑使用较短的maxLifetime
值。
经常刷新同一页面后会出现上述警告
超过maxLifetime
spring.datasource.hikari.auto-commit=false spring.datasource.hikari.idleTimeout=180000 spring.datasource.hikari.minimumIdle=5 spring.datasource.hikari.leakDetectionThreshold=240000 spring.datasource.hikari.maximumPoolSize=10 logging.level.com.zaxxer.hikari=TRACE spring.datasource.hikari.connectionTimeout=30000 spring.datasource.hikari.maxLifetime=300000 logging.level.com.zaxxer.hikari.HikariConfig=DEBUG
对于以下配置应用程序工作正常:
spring.datasource.hikari.auto-commit=false spring.datasource.hikari.idleTimeout=3000 spring.datasource.hikari.minimumIdle=5 spring.datasource.hikari.leakDetectionThreshold=240000 spring.datasource.hikari.maximumPoolSize=100 logging.level.com.zaxxer.hikari=TRACE spring.datasource.hikari.connectionTimeout=30000 spring.datasource.hikari.maxLifetime=60000 logging.level.com.zaxxer.hikari.HikariConfig=DEBUG
can any one explain what is happening exactly?
【问题讨论】:
每次刷新都打开一个新连接吗?请考虑添加Minimal, Complete, and Verifiable Examples。 【参考方案1】:正如错误消息所示,这是由 Hikari Connection Pool 尝试使用已关闭的连接引起的。
您的数据库连接只是 TCP 连接,当这些连接闲置时间过长时,它们可能会被数据库或中间的任何防火墙关闭。
Hikari CP 正在检查连接以查看它是否仍然存在并且可以使用。如果它已经关闭,它会警告您,因为打开新连接会增加数据库访问的延迟。
你可以看到isConnectionAlive
here方法中抛出的错误。
客户端
如错误消息所示,您可以减少 maxLifetime
配置来解决此问题。
maxLifetime
属性是客户端关闭连接之前的时间。正如 Hikari CP 文档中所建议的那样,这应该比任何数据库/架构超时至少短几秒钟。
原因是如果 Hikari CP 总是在数据库之前关闭连接,它永远不会尝试使用已经关闭的连接。
由于我不了解您的数据库或架构,因此我无法建议这应该是什么价值。你需要找出你连接的空闲超时来准确地设置你的maxLifetime
配置。
您可以在Hikari Github readme 上阅读此属性的文档。
数据库端
如果您的数据库(而不是防火墙等)是 TCP 超时的瓶颈,那么 Postgres 的一些连接设置也会产生影响。
我想提及这些,但实际上并没有必要更改这些,因为这些通常是合理的默认值。
您可以在Connection Settings Postgres documentation 中找到属性的文档
这些是您正在寻找的属性:
tcp_keepalives_idle
这是 TCP 连接在 操作系统发送一个 keepalive 消息。
tcp_keepalives_interval
这是操作系统发送未确认消息后的时间量 重试之前的keepalive消息。
tcp_keepalives_count
这是可以被确认的未确认的保活消息的数量 在连接被认为死之前发送。
【讨论】:
以上是关于无法验证连接(此连接已关闭。)。可能考虑使用更短的 maxLifetime 值的主要内容,如果未能解决你的问题,请参考以下文章
可能考虑使用更短的 maxLifetime 值 - hikari 连接池 spring boot
HikariPool-1 - 无法验证连接 org.postgresql.jdbc.PgConnection@2a84e649(此连接已关闭。)
PulsarClientException:连接已关闭 - 已验证网络、防火墙、Pulsar 令牌和角色正确