Java 批量处理

Java 里“批量处理”其实是一个非常常见的需求(数据库、文件、消息、集合运算),不同的场景会有不同的实现方式。我帮你总结一下常用的 批量处理方法

一、集合批量处理

  1. 分批(分页)处理

    • 大量数据时,不可能一次性加载到内存,要分批:
    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); // 批量处理
    }
    
  2. Java Stream 并行处理

    data.parallelStream().forEach(item -> process(item));
    
  3. 线程池批量提交任务

    ExecutorService executor = Executors.newFixedThreadPool(10);
    for (List<Integer> batch : split(data, 100)) {
        executor.submit(() -> process(batch));
    }
    

二、数据库批量处理

  1. 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();
    
  2. MyBatis 批量操作

    <insert id="insertBatch">
      insert into user(name) values
      <foreach collection="list" item="item" separator=",">
        (#{item.name})
      </foreach>
    </insert>
    
  3. MyBatis-Plus 批量

    userMapper.insertBatchSomeColumn(users);
    

三、消息批量处理

  1. Kafka 批量消费poll() 返回多条消息)

    ConsumerRecords<String, String> records = consumer.poll(Duration.ofMillis(100));
    for (ConsumerRecord<String, String> record : records) {
        process(record);
    }
    
  2. RabbitMQ 批量确认

    channel.basicAck(deliveryTag, true); // 批量 ack
    

四、文件批量处理

  1. 批量读取文件(逐行分批)

    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);
    }
    
  2. EasyExcel 批量读写(大文件分批处理,防止 OOM)

    EasyExcel.read(file, User.class, new PageReadListener<User>(dataList -> {
        process(dataList); // 每次处理一批
    })).sheet().doRead();
    

五、大数据场景批量处理

  • Spark / Flink:流式或批量计算。
  • MapReduce:批量数据分布式处理。

六、通用批量处理技巧

  1. 分批(batch size):避免一次性加载过大,典型大小 100~1000
  2. 异步/并行:配合线程池、CompletableFuture 提升吞吐。
  3. 批量提交:数据库、MQ 等尽量用 batch API。
  4. 背压(Backpressure):防止下游消费不过来(响应式框架常见)。

总结

  • 集合处理:分页、Stream、线程池
  • 数据库:JDBC 批量、MyBatis 批量
  • 消息中间件:Kafka 批量消费、RabbitMQ 批量 ack
  • 文件:分批读写、EasyExcel
  • 大数据:Spark、Flink
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

思静鱼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值