【Java】使用多线程从数据库查询数据
一个简单的多线程查询代码示例
·
在查询海量数据时,单线程的查询方式往往效率低下,此时可以考虑增加线程任务来提高查询效率,通过多线程并行处理,充分利用多核处理器的性能。下面给出一个简单的多线程查询代码示例
一、查询模版
多线程查询时有一个问题需要特别注意,那就是查询结果的顺序。多线程查询下不同的任务进度有快有慢,有可能第二个任务已经执行完了,第一个任务才走到一半。为了确保多线程查询结果的顺序与单线程一致,我们需要做到两件事
1、 dao 层查询语句中有指定排序 ( order by )
2、按顺序读取多线程任务查询的结果
重点讲下第二点:
线程池的 submit 方法会返回一个 Future 对象,我们将这些 Future 对象依次添加到 futures 列表中,这样 futures 列表中的 Future 对象就是按照任务提交的顺序存储的,按照列表的顺序就能获取有序的分页查询结果
/**
* 多线程查询数据
* @param workIds
* @return
*/
public List<ExcelVo> multiQueryOrder(String[] workIds){
int batchSize = 1000;
int totalIds = workIds.length;
int totalPages = (int) Math.ceil((double) totalIds / batchSize);
ExecutorService executorService = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors());
List<Future<List<ExcelVo>>> futures = new ArrayList<>();
for (int i = 0; i < totalPages; i++) {
int start = i * batchSize;
int end = Math.min(start + batchSize, workIds.length);
String[] batchIds = Arrays.copyOfRange(workIds, start, end);
// 替换成分页查询
Future<List<ExcelVo>> future = executorService.submit(() -> orderService.getOrders(batchIds));
futures.add(future);
}
executorService.shutdown();
try {
executorService.awaitTermination(Long.MAX_VALUE, TimeUnit.NANOSECONDS);
} catch (InterruptedException e) {
log.info("多线程查询任务异常", e);
}
List<ExcelVo> finalResult = new ArrayList<>();
for (Future<List<ExcelVo>> future : futures) {
try {
finalResult.addAll(0,future.get());
} catch (Exception e) {
log.info("future任务异常", e);
}
}
return finalResult;
}
二、学习交流
链接: Java-AI学习交流
一个人的精力是有限的,没有那么多的时间去探索新的事物,加入一个交流群就相当于增加了一个接触新事物、新想法、新机会的渠道,这就是交流群存在的意义,期待你的加入!
更多推荐
所有评论(0)