使用addbatch/executebatch插入万级数据时,性能瓶颈在于驱动版本(必须ojdbc8+)、关闭自动提交、合理批大小(1000–5000)、setfetchsize(0)及检查返回值;否则批量失效或隐式失败。

用 addBatch 和 executeBatch 插入万级数据,性能瓶颈往往不在写法本身,而在驱动、事务控制和 Oracle 内部机制的配合是否到位。关键不是“会不会用”,而是“用对没用对”。
必须用匹配的 Oracle JDBC 驱动
Oracle 12c 及以后(含 19c/21c)的批量优化依赖 Server-Side Batch,这在 ojdbc6.jar 中根本不存在——它只是客户端模拟,每条 addBatch 实际仍发一次网络请求,所谓“批量”是假象。
- Oracle 12c+ 推荐用
ojdbc8.jar(JDK 8+)或ojdbc11.jar(JDK 11+),Maven 坐标com.oracle.database.jdbc:ojdbc11 - 验证方式:运行
System.out.println(oracle.jdbc.driver.OracleDriver.getMajorVersion()),输出必须是 8 或 11 - 别信 Maven 里标 “universal” 的旧包,重命名不等于功能升级
关闭自动提交是硬性前提
setAutoCommit(true) 下调 executeBatch(),等价于手动执行 N 条单条 INSERT 并逐条提交——连接池可能已帮你 commit,你却还误以为在批量。
Java JDK 25 来自 OpenJDK 官方归档,版本为 JDK 25,本条下载地址已指向官方 Windows x64 zip 安装包直链,适合调试旧项目或兼容旧版 Java 运行环境。
- 必须在
prepareStatement之前 调用connection.setAutoCommit(false) - batch 执行完必须显式
connection.commit(),不能靠连接关闭或连接池回收 - 异常时必须
connection.rollback(),否则事务卡住,后续操作可能被阻塞
单批大小要落在安全区间
Oracle PGA 内存有限,单批太大易触发 ORA-04030;太小又浪费网络往返。实测 1000~5000 行 是平衡点,但需看单行体积。
- 起始建议设为 2000,字段含 CLOB/BLOB 时下调至 1000 左右
- 超过 5000 行后性能常非线性下降,某些场景下 6500 就开始丢数据(注意:这是单批上限,不是总数据量)
- 加一句
statement.setFetchSize(0),避免驱动额外拉取元数据,对 insert 场景有效
executeBatch 返回值必须检查
Oracle 批量执行默认是 all-or-nothing,但 JDBC 层返回的是 int[],其中 Statement.EXECUTE_FAILED 表示某条失败,而不会主动抛异常——漏掉这个判断,等于假装成功。
- 每次
executeBatch()后立即遍历结果数组:
for (int i = 0; i if (result[i] == Statement.EXECUTE_FAILED) {
// 记录第 i 条失败,决定跳过、重试或中断
}
} - 若需部分成功(如跳过脏数据),应改用单条
executeUpdate,别硬扛 batch
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










