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

Hikari连接Oracle时ActiveConnections持续上涨导致连接超时报错排查

问题根源

1. 连接引用丢失,Hikari代理连接未被正确关闭

你当前代码的写法直接丢失了Hikari代理连接的引用:

// 错误写法
try (OracleConnection conn = jdbcTemplate.getDataSource().getConnection().unwrap( OracleConnection.class );)

你调用getConnection()拿到的是Hikari封装的代理连接对象,链式调用unwrap()之后,你没有持有这个代理连接的引用,只有unwrap后得到的Oracle原生连接被放到了try-with-resources的资源声明中。
你调用原生OracleConnection的close()方法只会关闭底层物理连接,并不会通知Hikari回收这个代理连接,Hikari会一直认为该连接处于被占用状态,导致ActiveConnections持续上涨,这是你调整后问题依然存在的核心原因。

2. 原有事务逻辑额外占用连接

原代码添加@Transactional注解时,Spring事务管理器会自动绑定一个连接到当前线程上下文,你主动调用getConnection()相当于每次请求额外申请一个新连接,进一步加快了连接池占满的速度,你已经移除该注解,此问题已解决。

修复方案

正确的连接获取与unwrap写法

先将Hikari代理连接纳入try-with-resources管理,再进行unwrap操作:

public String getFormButtons() {
    // 先拿到Hikari代理连接,交给try-with-resources管理
    try (Connection hikariConn = hds.getConnection();
         // 再unwrap获取原生连接
         OracleConnection oracleConn = hikariConn.unwrap(OracleConnection.class)) {
        // 这里写你的业务逻辑
    } catch (Exception e) {
        e.printStackTrace();
    }
    // 其他逻辑
}

这种写法下,try-with-resources会自动调用Hikari代理连接的close()方法,Hikari会正常将连接标记为空闲、放回连接池,不会出现连接泄漏。

可选优化

如果你的业务逻辑不需要手动操作原生连接,优先使用JdbcTemplate封装的API,不需要自行获取连接,Spring会自动管理连接的生命周期,完全避免连接泄漏问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 18:36:02