postgresql 无法验证连接(此连接已关闭,),可能考虑使用较短的maxLifetime值

gcxthw6b  于 2022-12-18  发布在  PostgreSQL
关注(0)|答案(1)|浏览(458)

我看到以下错误消息:
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.maximumPoolSize=100
spring.datasource.hikari.maxLifetime=60000

有谁能解释一下到底发生了什么事吗?

tgabmvqs

tgabmvqs1#

如错误消息所示,这是由于Hikari连接池试图使用已关闭的连接而导致的。
您的数据库连接只是TCP连接,当这些连接闲置太久时,它们可能会被数据库或中间的任何防火墙关闭。
Hikari CP正在检查一个连接,看它是否还活着,是否可以使用。如果它已经被关闭,它会警告你,因为打开一个新的连接会增加数据库访问的延迟。你可以看到这个错误在isConnectionAlive方法中抛出。

客户端

如错误消息所示,您可以减少maxLifetime配置以解决此问题。
maxLifetime属性是客户端关闭连接之前的时间。正如Hikari CP文档中所建议的,这应该比任何数据库/体系结构超时至少短几秒钟。
原因是如果Hikari CP总是在关闭数据库之前关闭连接,它将永远不会尝试使用已经关闭的连接。
因为我不知道你的数据库或架构,我不能建议这个值应该是什么,你需要找出你的连接的空闲超时,以准确地设置你的maxLifetime配置。
您可以在Hikari Github readme上阅读此属性的文档。

数据库端

如果TCP超时的瓶颈是您的数据库(而不是防火墙等),那么Postgres的一些连接设置也会产生影响。

我想提到这些,但实际上没有必要更改,因为这些默认值通常是合理的。

您可以在连接设置Postgres文档中找到这些属性的文档
这些是您正在寻找的属性:

tcp保持活动状态空闲

这是操作系统发送keepalive消息之前TCP连接应处于空闲状态的时间。

tcp保持活动间隔

这是操作系统发送未确认的keepalive消息后重试之前的时间量。

tcp保持活动计数

这是在连接被视为已断开之前可以发送的未确认keepalive消息数。

相关问题