You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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实例的闲置超时设置:
    sp_configure 'show advanced options', 1;
    RECONFIGURE;
    sp_configure 'remote query timeout';
    
    如果你使用的是云托管的SQL Server实例,可直接在云控制台的实例配置页查看闲置超时参数。
  • 额外说明:你贴出的ReviewDAO代码存在语法错误,类定义后缺少成员变量声明,修正如下即可(该问题与连接异常无关,仅为编译层面问题):
// 修正后写法
public class ReviewDAO {
    private final Jdbi jdbi;

    public ReviewDAO(Jdbi jdbi) {
        this.jdbi = jdbi;
    }
    // 原有业务方法保持不变
}

该方案通过后台线程异步校验清理失效连接,几乎无性能损耗,同时可以保证连接池内保留的闲置连接均为有效状态,完全符合你保留闲置连接提升性能的需求。

内容的提问来源于stack exchange,提问作者Tanner Tran

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 10:15:03