JDBI连接池闲置后连接自动关闭抛出SQLServerException问题求助
问题根因
你遇到的The connection is closed异常核心是SQL Server服务端会主动断开超过闲置时长阈值的连接,而你当前连接池配置关闭了闲置连接有效性校验,连接池无法感知到连接已经被服务端断开,仍然将失效连接分配给业务调用,最终触发异常。
生产级根源解决方案
不需要依赖checkConnectionOnBorrow: true(每次获取连接都校验会带来不必要的性能损耗),仅需要调整连接池配置即可解决:
- 调整config.yml中database配置块,新增/修改以下参数:
database: # 开启闲置连接后台校验 checkConnectionWhileIdle: true # 闲置连接校验间隔,必须小于SQL Server端的闲置连接超时时间,建议设置为服务端超时的1/2。如SQL Server默认闲置超时为30分钟,此处设置为15分钟 checkConnectionInterval: 15m # 连接最大闲置时长,超过该时长的连接会被自动清理出池,建议设置为比服务端闲置超时少2分钟,如28分钟 maxIdleTime: 28m # 可选:设置连接最大存活时间,避免长连接出现未知异常,生产环境建议设置为6-12小时 maxConnectionAge: 8h # 指定连接有效性校验语句,适配SQL Server validationQuery: SELECT 1 # 原有配置保留即可 maxWaitForConnection: 10s minSize: 10 initialSize: 10 maxSize: 100
- 确认SQL Server服务端的闲置连接超时配置,避免连接池校验周期超过服务端阈值
你可以通过以下SQL查询当前SQL Server实例的闲置超时设置:
如果你使用的是云托管的SQL Server实例,可直接在云控制台的实例配置页查看闲置超时参数。sp_configure 'show advanced options', 1; RECONFIGURE; sp_configure 'remote query timeout'; - 额外说明:你贴出的ReviewDAO代码存在语法错误,类定义后缺少成员变量声明,修正如下即可(该问题与连接异常无关,仅为编译层面问题):
// 修正后写法 public class ReviewDAO { private final Jdbi jdbi; public ReviewDAO(Jdbi jdbi) { this.jdbi = jdbi; } // 原有业务方法保持不变 }
该方案通过后台线程异步校验清理失效连接,几乎无性能损耗,同时可以保证连接池内保留的闲置连接均为有效状态,完全符合你保留闲置连接提升性能的需求。
内容的提问来源于stack exchange,提问作者Tanner Tran
相关产品推荐
相关产品推荐

