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
相关产品推荐
相关产品推荐

