rewriteBatchedStatements=true是MySQL批量插入性能跃升的关键开关,开启后驱动将多条INSERT合并为单条多值语句,避免逐条网络请求;需配合useServerPrepStmts=true和cachePrepStmts=true才能发挥最佳效果。

直接用 Statement.addBatch() 替代循环执行单条 SQL,是降低网络往返最直接有效的手段。核心在于把多次独立请求合并成一次批量提交,避免每条 SQL 都触发完整的 TCP 握手、SQL 解析、事务开销和结果返回。
明确区分 Statement 与 PreparedStatement 的适用场景
Statement 批处理适合 SQL 结构固定、参数值简单拼接的场景(如导入日志、初始化基础数据);而 PreparedStatement 更适合含动态参数、需防注入的业务插入。两者都支持批处理,但底层机制不同:
- Statement:每次
addBatch("INSERT INTO t(x) VALUES ('a')")是完整 SQL 字符串,适合模板不变、值可安全拼接的情况 - PreparedStatement:绑定同一 SQL 模板,反复
setString(1, value)+addBatch(),安全性高、预编译复用强
控制批次大小,避免内存或事务超限
单次 executeBatch() 不宜过大。MySQL 默认 max_allowed_packet 约 4MB,Oracle 对批大小也有隐式限制。实践中建议:
MiniMax 图片理解 + 网络搜索 MCP 工具。适配 Docker 环境(极空间等),支持图片 OCR 识别、图像内容理解、网络搜索。API Key 安全存储在本地 credentials 文件,不暴露在代码中。
- 每批 50–500 条较稳妥(具体按单行数据体积调整)
- 在循环中每 N 条调用一次
executeBatch(),再紧跟clearBatch() - 最后别漏掉剩余未提交的语句(循环结束后补一次 executeBatch)
关闭自动提交,显式管理事务边界
默认 autoCommit=true 时,每批执行都会隐式提交,失去事务一致性且加重日志压力。必须:
立即学习“Java免费学习笔记(深入)”;
- 连接获取后立即
conn.setAutoCommit(false) - 全部批处理完成后统一
conn.commit() - 出错时
conn.rollback(),防止部分写入
配合 JDBC 连接参数启用底层批量优化
仅靠 Java 层 addBatch 不够,需数据库驱动协同。以 MySQL 为例,URL 中应启用:
-
rewriteBatchedStatements=true:将多条 INSERT 合并为一条多值 INSERT(如VALUES (..),(..),(..)),大幅减少解析次数 -
useServerPrepStmts=false(配合 rewrite 使用):避免预编译干扰重写逻辑 - HikariCP 等连接池中还可设置
connection-timeout和max-lifetime避免长事务阻塞连接


















