Spring:使用多线程从表中获取数据

问题描述

我有一个大约有 5,00,000 行的表。 我愿意使用多线程从该表中获取数据,每个批次 50,000, 因为在每个线程中应该有 50,000 行。每个线程的应该是唯一的。 我能够创建一个线程:

    @Async
    public CompletableFuture<List<Employee>> findAllFromEmployee() {

        final List<Employee> employees = employeeRepository.findAll();
        return CompletableFuture.completedFuture(employees);
    }

我定义了这样的任务执行器:

@Bean(name = "taskExecutor")
    public Executor taskExecutor() {
        System.out.println("Creating Async Task Executor");
        final ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        executor.setCorePoolSize(2);
        executor.setMaxPoolSize(2);
        executor.setQueueCapacity(100);
        executor.setThreadNamePrefix("EmployeeThread-");
        executor.initialize();
        return executor;
    }

我不明白我应该如何确保每个线程只读取 50,000 个字段。 谢谢!!

解决方法

以一致的方式对表格中的结果进行排序(例如按主键排序)。假设您的主键是一个名为“id”的字段,您可以使用:

employeeRepository.findAllOrderById()

然后从第 0 行到第 50,000 行,用线程 #1 处理它们,50,001 到 100,000 转到线程 #2,依此类推。