Java多线程批量操作提速核心是分而治之、并发执行与批量提交:按500–2000条切分数据,线程池控制并发数(IO密集型建议CPU核数×2~4),每线程内用MyBatis foreach或JDBC addBatch批量写入,并配独立连接与合理错误处理。

Java 中用多线程配合批量操作提升速度,核心在于“分而治之 + 并发执行 + 批量提交”,不是简单开多个线程各插10条,而是让每个线程处理一个中等粒度的批次(比如500–2000条),同时控制并发数避免压垮数据库或JVM。
合理拆分数据并分配给线程
大列表不能直接扔给多个线程去遍历——容易竞争、越界或重复。推荐用 Lists.partition(Guava)或手动切片:
- 将原始数据 List 按固定大小(如 1000)切分为若干子列表
- 每个子列表作为独立任务提交给线程池,确保无共享状态、无交叉修改
- 避免使用共享的 ArrayList 或静态集合在多线程间传参,防止并发修改异常
用线程池代替 new Thread(),配合适当参数
频繁创建线程开销大,且难以管理。应使用 ThreadPoolExecutor 显式配置:
- I/O 密集型任务(如数据库插入):线程数建议设为 CPU 核心数 × 2~4,例如 8 核机器可设 16~32
- 任务队列推荐用 LinkedBlockingQueue,容量不宜过大(如 100),防内存溢出
- 拒绝策略选 CallerRunsPolicy,让调用线程自己执行,起到自然降速作用
每个线程内做真正的批量操作
单线程内仍要避免逐条 insert,否则并发再高也白搭。必须结合 ORM 或 JDBC 的批量能力:
- MyBatis:Mapper XML 中用
实现单 SQL 多值插入,如INSERT INTO t VALUES (#{x}), (#{y}) - JDBC:调用
PreparedStatement.addBatch()+executeBatch(),并设置rewriteBatchedStatements=true(MySQL 驱动特有优化) - 每批大小建议 500~2000 条,太小则网络/SQL 解析开销占比高,太大易触发 OOM 或事务超时
注意一致性与错误处理
并发+批量不等于放任失败。关键点包括:
- 每个线程使用独立数据库连接(连接池自动保证),禁止跨线程复用 Connection 或 PreparedStatement
- 单个批次失败不影响其他批次,记录失败批次数据和异常,便于重试或告警
- 如需强一致性(如全部成功才生效),不适合纯多线程批量;应改用分布式事务或两阶段提交,但性能代价大
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











