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

