Java 里“批量处理”其实是一个非常常见的需求(数据库、文件、消息、集合运算),不同的场景会有不同的实现方式。我帮你总结一下常用的 批量处理方法:
一、集合批量处理
-
分批(分页)处理
- 大量数据时,不可能一次性加载到内存,要分批:
List<Integer> data = IntStream.rangeClosed(1, 1000).boxed().toList(); int batchSize = 100; for (int i = 0; i < data.size(); i += batchSize) { List<Integer> batch = data.subList(i, Math.min(i + batchSize, data.size())); process(batch); // 批量处理 } -
Java Stream 并行处理
data.parallelStream().forEach(item -> process(item)); -
线程池批量提交任务
ExecutorService executor = Executors.newFixedThreadPool(10); for (List<Integer> batch : split(data, 100)) { executor.submit(() -> process(batch)); }
二、数据库批量处理
-
JDBC 批量插入
Connection conn = dataSource.getConnection(); PreparedStatement ps = conn.prepareStatement("INSERT INTO user(name) VALUES(?)"); for (int i = 0; i < users.size(); i++) { ps.setString(1, users.get(i).getName()); ps.addBatch(); if (i % 1000 == 0) { // 每 1000 提交一次 ps.executeBatch(); ps.clearBatch(); } } ps.executeBatch(); -
MyBatis 批量操作
<insert id="insertBatch"> insert into user(name) values <foreach collection="list" item="item" separator=","> (#{item.name}) </foreach> </insert> -
MyBatis-Plus 批量
userMapper.insertBatchSomeColumn(users);
三、消息批量处理
-
Kafka 批量消费(
poll()返回多条消息)ConsumerRecords<String, String> records = consumer.poll(Duration.ofMillis(100)); for (ConsumerRecord<String, String> record : records) { process(record); } -
RabbitMQ 批量确认
channel.basicAck(deliveryTag, true); // 批量 ack
四、文件批量处理
-
批量读取文件(逐行分批)
try (BufferedReader br = new BufferedReader(new FileReader("data.txt"))) { List<String> batch = new ArrayList<>(); String line; while ((line = br.readLine()) != null) { batch.add(line); if (batch.size() == 1000) { process(batch); batch.clear(); } } if (!batch.isEmpty()) process(batch); } -
EasyExcel 批量读写(大文件分批处理,防止 OOM)
EasyExcel.read(file, User.class, new PageReadListener<User>(dataList -> { process(dataList); // 每次处理一批 })).sheet().doRead();
五、大数据场景批量处理
- Spark / Flink:流式或批量计算。
- MapReduce:批量数据分布式处理。
六、通用批量处理技巧
- 分批(batch size):避免一次性加载过大,典型大小
100~1000。 - 异步/并行:配合线程池、CompletableFuture 提升吞吐。
- 批量提交:数据库、MQ 等尽量用 batch API。
- 背压(Backpressure):防止下游消费不过来(响应式框架常见)。
总结
- 集合处理:分页、Stream、线程池
- 数据库:JDBC 批量、MyBatis 批量
- 消息中间件:Kafka 批量消费、RabbitMQ 批量 ack
- 文件:分批读写、EasyExcel
- 大数据:Spark、Flink
4242

被折叠的 条评论
为什么被折叠?



