java批量数据库操作需先关闭自动提交(setautocommit(false)),再复用同一connection和preparedstatement执行addbatch()与分批executebatch(),最后显式commit或rollback以确保事务一致性。

Java 中批量数据库操作要真正生效且具备事务一致性,必须关闭自动提交,并把多条语句“攒起来”统一执行。关自动提交不是可选项,而是批量操作能回滚、能控制提交时机的前提。
必须在执行任何 SQL 前调用 setAutoCommit(false)
Connection 默认是 autoCommit = true,意味着每条 executeUpdate() 或 addBatch() + executeBatch() 都会立刻落库。一旦执行,就无法回滚。所以第一行有效代码就该是:
- connection.setAutoCommit(false);
- 这行必须出现在 prepareStatement 创建之后、任何 addBatch() 之前
- 如果先查数据(SELECT)、再设 false、再插入,而中间又混了 UPDATE,那 SELECT 虽不改数据,但后续 DML 可能因顺序错乱提前提交
用同一个 Connection 和 PreparedStatement 做批量
所有 addBatch() 操作必须基于同一个 Connection 实例,否则事务边界就断了。不同连接 = 不同事务,哪怕都关了 autoCommit,也无法保证原子性。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 不要在循环中反复调用 dataSource.getConnection()
- PreparedStatement 复用一个实例,或至少确保都由同一个 connection 创建
- 示例节奏:获取 connection → setAutoCommit(false) → prepareStatement → 循环 addBatch() → executeBatch() → commit()
分批次执行避免内存和锁问题
一次性 addBatch 10 万条容易 OOM 或长时间持有数据库锁。推荐按固定大小切片,执行一批、清空一批:
- 每 500 或 1000 条调一次 executeBatch()
- 紧接着调 ps.clearBatch(),释放内存并重置批处理队列
- 循环结束后,别忘了对剩余未执行的 batch 再调一次 executeBatch()
- 最后统一 connection.commit(),整个批量才算完成
异常时必须 rollback,不能只靠 finally 关闭连接
连接关闭时若事务未 commit,多数驱动会静默 rollback——你以为提交了,其实什么都没留。
- catch 块里立即 connection.rollback()
- rollback 后可选调 connection.setAutoCommit(true),防止连接归还池后状态污染
- finally 中只做资源释放:close PreparedStatement、ResultSet、Connection
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










