要让JDBC批处理真正高效,必须启用MySQL驱动的rewriteBatchedStatements=true参数,配合useServerPrepStmts=true和cachePrepStmts=true,并使用PreparedStatement、手动事务控制及合理批大小;该参数仅适用于MySQL,对Oracle等无效。

要让 JDBC 批处理真正高效,关键不是只写 addBatch() 和 executeBatch(),而是必须开启 MySQL 驱动的 rewriteBatchedStatements=true 参数——否则只是“假批量”,实际仍逐条发送 SQL。
连接 URL 中正确启用参数
在 JDBC 连接字符串末尾加上该参数,并确保使用 5.1.13+ 版本的 MySQL Connector/J:
jdbc:mysql://localhost:3306/mydb?rewriteBatchedStatements=true&useSSL=false&serverTimezone=UTC注意:
• 必须用 &(URL 编码后的 &)拼接多个参数
• 不支持 Oracle、PostgreSQL 等其他数据库驱动,仅对 MySQL 有效
• 参数名大小写不敏感,但推荐小写保持一致性
配套驱动参数建议一起开启
单开 rewriteBatchedStatements=true 效果有限。实测中,这三个参数协同作用才能释放最大性能:
- useServerPrepStmts=true:让 MySQL 服务端真正预编译语句,避免每次重写后重复解析
- cachePrepStmts=true:缓存 PreparedStatement 对象,减少创建开销
-
rewriteBatchedStatements=true:触发客户端语句合并(INSERT 变成多值,UPDATE/DELETE 需配合
allowMultiQueries=true)
完整示例:
jdbc:mysql://host/db?rewriteBatchedStatements=true&useServerPrepStmts=true&cachePrepStmts=true&useSSL=false
Java 代码侧必须配合的操作
参数开了,代码没写对,照样无效。重点如下:
当用户要求为 Java 代码添加注释、修改注释、审查注释、整理注释格式,或要求按照代码注释规范处理 Java 文件时,使用本技能。本技能用于统一生成和维护 Java 类注释模板、按 Git 对比 release 判断版本号、补充每行代码上方中文块注释、调整注释空行规则,并保持 Java 文件 UTF-8 无 BOM 编码。典型触发场景包括:补充类注释、更新 @version、检查 @author 来源、整理行尾注释、把注释放到代码上一行、检查注释是否符合规范、构建前检查 Java 注释风格。
立即学习“Java免费学习笔记(深入)”;
- 用
PreparedStatement,不能用Statement(后者不支持重写) - 调用
conn.setAutoCommit(false)关闭自动提交 - 循环中只做
pst.setXXX()→pst.addBatch(),绝不调executeUpdate() - 每 500–1000 条执行一次
pst.executeBatch(),之后立即pst.clearBatch() - 全部完成后显式
conn.commit()
批大小不宜过大(如超 5000),否则可能触发 MySQL 的 max_allowed_packet 限制或内存压力。
Oracle 等其他数据库怎么办?
rewriteBatchedStatements 对 Oracle 完全无效 —— ojdbc 驱动根本不识别该参数。Oracle 批量优化靠的是:
- 使用
setArray()进行数组绑定(Array DML) - 设置
defaultRowPrefetch=200提升内部缓冲效率 - 控制批大小在 50–200 之间(比 MySQL 更小)
- 避免混用查询或 DDL 操作
别在 Oracle 场景下硬加这个参数,日志里不会报错,但也不会带来任何提升。


















