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

Spring Batch出现HikariPool连接不可用30000ms超时问题求解

根本原因

报错是JDBC连接泄漏导致的Hikari连接池耗尽。你当前的代码仅关闭了CallableStatement对象,但未归还从数据源申请的JDBC连接,连接池中的连接被持续标记为占用状态,后续业务逻辑申请连接时无可用资源,最终触发30s超时错误。

  • DataSource#getConnection会从连接池取出一个连接,只要不调用Connection#close方法,该连接就不会被释放回连接池,关闭该连接下创建的Statement/ResultSet不会触发连接归还逻辑。
  • 调整线程池参数无效是因为问题根源与线程池无关,无论线程数量多大,连接池被占满后所有申请连接的操作都会阻塞超时。

修复方案

推荐使用Java 7+提供的try-with-resources语法自动管理资源,无需手动编写关闭逻辑,可避免资源遗漏释放:

@Override
public void beforeJob(JobExecution jobExecution) {
    try (
        Connection conn = MyDataSource.getConnection();
        CallableStatement cs = conn.prepareCall("CALL my_proc(?,?)")
    ) {
        cs.setString(1, "my_arg1");
        cs.setString(2,"my_arg2");
        cs.execute();
    } catch (SQLException e) {
        // 按需处理异常,如日志记录、任务终止
        throw new RuntimeException("存储过程调用失败", e);
    }
}

如果你的项目已经集成Spring JDBC模块,也可以直接使用JdbcTemplate调用存储过程,Spring会自动管理连接的申请和释放,从根源上避免连接泄漏问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 16:36:03