clearBatch()是JDBC批处理中唯一标准清空缓存的方法,用于清除Statement或PreparedStatement中已addBatch但未执行的SQL或参数批次;它不抛异常、无返回值,调用后缓冲区立即为空,且不可用重建对象替代。

Java 中 JDBC 批处理的“缓存”不是传统意义上的内存缓存,而是 JDBC 驱动内部暂存的 SQL 语句或参数批次。清空它用的是标准 API 方法:clearBatch()。
clearBatch() 是唯一标准清空方式
无论使用 Statement 还是 PreparedStatement,都必须调用该方法来清除已添加但尚未执行的批处理内容。不调用它,下次 executeBatch() 会重复执行之前残留的语句,导致数据重复或异常。
- Statement.clearBatch():清空已 addBatch(sql) 的 SQL 字符串列表
- PreparedStatement.clearBatch():清空已 addBatch() 的参数组(即多组 ? 占位符值)
- 该方法不抛异常,无返回值,调用后缓冲区立即为空
为什么不能靠重新创建对象代替 clearBatch()
虽然新建 Statement 或 PreparedStatement 确实能绕过旧批次,但这是低效且危险的做法:
- 频繁创建对象增加 GC 压力,尤其在循环中
- 未关闭旧 Statement 可能引发连接泄漏或资源耗尽
- 破坏连接复用和预编译优化(特别是 PreparedStatement)
- 事务上下文可能丢失,影响一致性
典型安全用法:分批 + 清空 + 异常防护
推荐在每次 executeBatch() 后立即 clearBatch(),并放在 finally 或 try-with-resources 的收尾逻辑中:
立即学习“Java免费学习笔记(深入)”;
- 循环中每累积 100–500 条就 executeBatch() + clearBatch()
- 循环结束后再执行一次 executeBatch()(处理剩余不足一批的数据)
- 确保 clearBatch() 在 finally 块中调用,避免因异常跳过清空
- 配合 setAutoCommit(false) 和 commit()/rollback() 管理事务
注意 clearBatch 不等于关闭连接或释放资源
clearBatch() 只清空当前批处理队列,不影响 Connection、Statement 或 PreparedStatement 本身的生命周期:
- Connection 仍保持打开,可继续用于后续批处理或查询
- PreparedStatement 的预编译 SQL 依然有效,addBatch() 可继续复用
- 真正的资源释放需显式调用 close(),建议用 try-with-resources


















