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

使用try-with-resource处理PreparedStatement时出现关闭异常的原因排查

问题分析与解决方案

结论:没错,就是try-with-resource导致PreparedStatement在JdbcTemplate使用前就被关闭了

原因

try-with-resource语法会在代码块执行完毕后自动关闭实现AutoCloseable接口的资源。你在createPreparedStatement方法内部用try-with-resource创建了PreparedStatement,当方法执行到return ps后,try代码块结束,PreparedStatement会被立即自动关闭。而Spring JdbcTemplate拿到这个已经关闭的Statement去执行数据库操作时,就会抛出你遇到的“Statement is closed”错误。

修正方案

去掉try-with-resource,直接创建PreparedStatement并返回即可。Spring JdbcTemplate内部会负责管理Statement和Connection的生命周期,执行完操作后会自动关闭相关资源,无需手动处理。

修正后的代码:

getJdbcTemplate().update(new PreparedStatementCreator() {
    public PreparedStatement createPreparedStatement(Connection connection) throws SQLException {
        PreparedStatement ps = connection.prepareStatement(INSERT_BATCH, new String[] { "batch_id" });
        int index = 1;
        ps.setString(index++, batch.getBatchType());
        ps.setTimestamp(index++, getSQLDateTime(batch.getStartedOn()));
        ps.setString(index++, batch.getStatus());
        ps.setString(index++, batch.getHostName());

        return ps;
    }
}, keyHolder);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 18:57:14