Java批量插入性能调优核心在于适配数据库底层机制:需匹配版本驱动(如Oracle 12c+用ojdbc8/11)、关闭自动提交、设batchSize为1000~5000、Oracle用INSERT ALL、MySQL开启rewriteBatchedStatements=true,并检查executeBatch返回值后手动commit。

Java批量插入性能调优不是堆参数或加线程就能解决的事,核心在于让每一步都贴合数据库底层机制——特别是驱动行为、事务控制和SQL执行方式。错一个环节,比如用错JDBC驱动或开着自动提交,性能可能直接掉一个数量级。
匹配数据库版本的Oracle JDBC驱动
这是最容易被忽略的“隐形瓶颈”。Oracle 12c及以上(含19c/21c)必须用 ojdbc8.jar(JDK 8+)或 ojdbc11.jar(JDK 11+),它们支持Server-Side Batch优化;而ojdbc6.jar会退化为客户端模拟批处理,每条语句仍单独发包,网络开销翻倍。
- 验证方式:运行
System.out.println(oracle.jdbc.driver.OracleDriver.getMajorVersion()),输出应为 8 或 11 - Maven里标“universal”的包不等于新版——很多只是重命名的ojdbc6,务必核对SHA256或jar内MANIFEST.MF
- MySQL同理:必须开启
rewriteBatchedStatements=true参数,否则JDBC仍按单条发送
关闭自动提交 + 合理设置batchSize
autoCommit=true时,每次executeBatch()都会触发完整事务提交,批量就彻底失效。必须显式关闭,并手动控制提交时机。
当用户要求为 Java 代码添加注释、修改注释、审查注释、整理注释格式,或要求按照代码注释规范处理 Java 文件时,使用本技能。本技能用于统一生成和维护 Java 类注释模板、按 Git 对比 release 判断版本号、补充每行代码上方中文块注释、调整注释空行规则,并保持 Java 文件 UTF-8 无 BOM 编码。典型触发场景包括:补充类注释、更新 @version、检查 @author 来源、整理行尾注释、把注释放到代码上一行、检查注释是否符合规范、构建前检查 Java 注释风格。
-
connection.setAutoCommit(false)是硬性前提,缺一不可 - 单批行数建议设在 1000~5000 之间:太小起不到批量效果;超10000易触发Oracle PGA内存溢出(ORA-04030)或MySQL max_allowed_packet超限
- 对Oracle,加上
statement.setFetchSize(0),避免驱动额外拉取元数据增加延迟
用INSERT ALL替代重复VALUES(Oracle专属)
当单条记录字段较多(如>10列),拼1000条INSERT INTO t(a,b,c) VALUES(?,?,?)会导致Oracle硬解析压力陡增。改用INSERT ALL可复用同一执行计划,CPU开销大幅下降。
立即学习“Java免费学习笔记(深入)”;
- 写法示例:
INSERT ALL INTO t(a,b) VALUES(?,?) INTO t(a,b) VALUES(?,?) SELECT * FROM DUAL - 注意:单条INSERT ALL最多支持约1000个INTO子句,超了要主动拆批
- MySQL无此语法,但可用
INSERT INTO t(a,b) VALUES (?,?),(?,?),...实现类似效果
executeBatch后必须检查返回值并手动commit
JDBC的executeBatch()不抛异常不代表成功——它返回int[]数组,其中Statement.EXECUTE_FAILED表示对应位置语句失败。全量失败才抛BatchUpdateException,部分失败则静默。
- 务必遍历返回数组判断每条执行状态
- 成功后立即调用
connection.commit(),别依赖连接池close时回滚或提交 - 若需容错(如跳过脏数据),batch模式不适用,应改用单条PreparedStatement+try-catch


















