java循环分页查询数据,任何把查询到的数据,分批处理,多线程提交到数据库清洗数据

while循环分页查询数据,任何把查询到的数据,分批多线程提交到数据库清洗数据,具体实现如下

  • 分页循环:使用while循环逐页获取订单数据(每页1000条)。 分批处理:将每页数据拆分为每批10条的小批次。
  • 多线程执行:通过ExecutorService提交任务,使用线程池并发处理每个批次。
  • 延迟控制:在提交每批次任务后,主线程等待200毫秒再提交下一批任务,确保批次提交间隔。

以下是完善后的代码实现,使用 List<Future<?>> 收集任务,并通过 for 循环逐批提交任务,同时控制提交间隔为200ms:

完善后的代码

java 复制代码
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.*;

public class OrderProcessor {

    private static final int THREAD_POOL_SIZE = 10; // 根据业务调整线程池大小
    private static final int BATCH_SIZE = 10; // 每批处理10条数据

    public void processOrders() {
        int currentPage = 1;
        int pageSize = 1000; // 每页1000条
        ExecutorService threadPool = ThreadPoolFactory.getThreadPool(); // 从工厂获取线程池

        while (true) {
            List<Order> currentPageData = queryOrders(currentPage, pageSize);
            if (currentPageData.isEmpty()) {
                break;
            }

            // 将当前页数据拆分为每批10条的列表
            List<List<Order>> splitBatchs = splitDataIntoBatches(currentPageData, BATCH_SIZE);

            // 使用Future列表管理任务
            List<Future<?>> futureList = new ArrayList<>();
            for (List<Order> batch : splitBatchs) {
                Future<?> future = threadPool.submit(() -> processBatch(batch));
                futureList.add(future);

                try {
                    Thread.sleep(200); // 主线程等待200ms再提交下一批任务
                } catch (InterruptedException e) {
                    Thread.currentThread().interrupt();
                    throw new RuntimeException("线程被中断", e);
                }
            }

            // 等待当前页所有任务完成(可选)
            for (Future<?> future : futureList) {
                try {
                    future.get(); // 等待任务完成并处理可能的异常
                } catch (Exception e) {
                    // 处理任务执行异常
                    e.printStackTrace();
                }
            }

            currentPage++;
        }
        threadPool.shutdown();
    }

    // 拆分数据为批次
    private List<List<Order>> splitDataIntoBatches(List<Order> data, int batchSize) {
        List<List<Order>> batches = new ArrayList<>();
        for (int i = 0; i < data.size(); i += batchSize) {
            batches.add(data.subList(i, Math.min(i + batchSize, data.size())));
        }
        return batches;
    }

    // 处理每个批次的业务逻辑
    private void processBatch(List<Order> batch) {
        // 业务逻辑(如保存到历史快照表)
        saveToSnapshotTable(batch);
    }

    // 假设的查询方法
    private List<Order> queryOrders(int page, int size) {
        // 实现分页查询逻辑(通过框架如MyBatis/Spring Data JPA)
        return new ArrayList<>();
    }

    // 保存到历史表(依赖框架的DAO/Repository)
    private void saveToSnapshotTable(List<Order> batch) {
        // 使用框架提供的DAO或Repository执行批量插入
    }
}

关键点说明

  1. 线程池获取:
    • 使用 ThreadPoolFactory.getThreadPool() 替换直接创建线程池,确保与框架整合(如Spring的线程池管理)。
  2. Future列表管理:
    • 将每个任务的 Future 对象存入 futureList,便于后续统一处理任务结果或异常。
  3. 批次提交间隔:
    • 在 for 循环中,每提交一个批次后调用 Thread.sleep(200),确保主线程等待200ms后提交下一批任务。
  4. 任务等待与异常处理:
    • 可选择性调用 future.get() 等待任务完成(如需保证顺序或处理异常)。

注意事项

  1. 线程安全:
    • 确保 saveToSnapshotTable 等业务方法是线程安全的(例如使用框架的事务注解 @Transactional)。
  2. 性能优化:
    • 根据实际压力调整线程池大小(THREAD_POOL_SIZE),避免资源竞争。
  3. 异常处理:
    • 在 future.get() 中捕获 ExecutionException 和 InterruptedException,并根据需求重试或记录日志。
  4. 框架集成:
    • 若使用Spring,可通过 @Async 注解简化异步任务提交,但需结合自定义线程池。
    此方案兼顾了分页处理和多线程效率,同时通过 Future 管理任务状态,确保逻辑可控。
相关推荐
小陈工3 小时前
Python Web开发入门(十七):Vue.js与Python后端集成——让前后端真正“握手言和“
开发语言·前端·javascript·数据库·vue.js·人工智能·python
0xDevNull7 小时前
MySQL数据冷热分离详解
后端·mysql
一定要AK7 小时前
Spring 入门核心笔记
java·笔记·spring
A__tao7 小时前
Elasticsearch Mapping 一键生成 Java 实体类(支持嵌套 + 自动过滤注释)
java·python·elasticsearch
KevinCyao7 小时前
java视频短信接口怎么调用?SpringBoot集成视频短信及回调处理Demo
java·spring boot·音视频
科技小花7 小时前
数据治理平台架构演进观察:AI原生设计如何重构企业数据管理范式
数据库·重构·架构·数据治理·ai-native·ai原生
一江寒逸7 小时前
零基础从入门到精通MySQL(中篇):进阶篇——吃透多表查询、事务核心与高级特性,搞定复杂业务SQL
数据库·sql·mysql
D4c-lovetrain7 小时前
linux个人心得22 (mysql)
数据库·mysql
迷藏4947 小时前
**发散创新:基于Rust实现的开源合规权限管理框架设计与实践**在现代软件架构中,**权限控制(RBAC)** 已成为保障
java·开发语言·python·rust·开源
阿里小阿希8 小时前
CentOS7 PostgreSQL 9.2 升级到 15 完整教程
数据库·postgresql