问题描述
我有一个大约有 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,依此类推。