核心是减少网络往返和sql解析次数,将多次小操作变为少量大操作;单条插入10万次需10万次网络请求和编译,批量插入100次(每次1000条)使开销降至约1%。

核心是减少网络往返和 SQL 解析次数,把“多次小操作”变成“少量大操作”。单条插入 10 万次,本质是 10 万次网络请求 + 10 万次 SQL 编译;批量插入 100 次(每次 1000 条),网络和解析开销直接降到约 1%。
用对批处理方式:优先选 MyBatis 的 ExecutorType.BATCH
Spring Boot 项目中,配置 SqlSessionFactoryBean 时指定执行器类型:
- 设置
executorType = ExecutorType.BATCH,MyBatis 会复用同一个 PreparedStatement,并自动累积 addBatch - 避免手动管理 batch 清空逻辑,也规避了因忘记
executeBatch()导致数据滞留的隐患 - 比纯 JDBC
addBatch/executeBatch更简洁,比 XML 中拼接<foreach></foreach>更安全(无 SQL 长度超限风险)
控制批次大小:1000~5000 是多数场景的平衡点
太小或太大都会引入新瓶颈:
你接手一个需求时,是不是经常这样:"改一个小字段 → 结果把不相关的代码也改了"、"需求说得很模糊 → 做着做着发现跑偏了"、"数据库加个字段 → 上线才发现漏了数据兼容"、"做了个新功能 → 一个月后自己都忘了当时怎么设计的"、"写到一半被中断 → 再回来不知道从哪继续";这个 Skill 就是专门解决这些问题的。 它会自动探测你的项目环境(JDK、Spring Boot、ORM、数据库、前端框架),记在
- 小于 100:网络往返频繁,总耗时不降反升
- 大于 10000:单次内存占用陡增,MySQL 的
max_allowed_packet可能被突破,锁表时间变长影响并发写入 - 建议从 2000 起调测,结合实际数据行宽、JVM 堆大小、数据库负载动态微调
配合关键数据库参数:开启 rewriteBatchedStatements=true
这是 MySQL JDBC 驱动的隐藏加速开关,必须显式启用:
- 在 JDBC URL 中添加:
?rewriteBatchedStatements=true - 它能把多个
INSERT INTO t VALUES(?)合并成一条INSERT INTO t VALUES(?),(?),(?)... - 实测可将批量插入速度再提升 3~5 倍,尤其对 PreparedStatement 批处理效果显著
避免常见陷阱:事务粒度与连接稳定性
大批量导入不是越“大事务”越好:
- 单个事务包 10 万条,一旦失败需全部回滚,重试成本高、锁持有久
- 推荐每批(如 2000 条)单独 commit,用
@Transactional(propagation = Propagation.REQUIRES_NEW)或手动控制事务边界 - 确保连接池(如 HikariCP)配置合理:
maximumPoolSize足够支撑并发批次,connection-timeout不宜过短,防止中途断连
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










