无法验证连接(此连接已关闭。)。可能考虑使用更短的 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 正在检查连接以查看它是否仍然存在并且可以使用。如果它已经关闭,它会警告您,因为打开新连接会增加数据库访问的延迟。 你可以看到isConnectionAlivehere方法中抛出的错误。

客户端

如错误消息所示,您可以减少 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 令牌和角色正确

错误619:不能建立到远程计算机的连接,因此用于此连接的端口已关闭

网页可能暂时无法连接,或者它已永久性地移动到了新网址

如何在java中编写更短的双数? [关闭]