資料量大時使用多執行緒查詢mysql資料和單執行緒對比
阿新 • • 發佈:2020-12-21
技術標籤:java技術
jdk8有一個非同步類CompletableFuture可以使用執行緒池幫助我們實現多執行緒查詢
@PostConstruct
private void multithreadingGetData() {
// 資料總量
int count = 312;
// 計算機可用cpu 設定執行緒池個數最好與之匹配
int availableProcessors = Runtime.getRuntime().availableProcessors();
// 每個執行緒要查多少條
int num = count / availableProcessors;
ExecutorService executorService = Executors.newFixedThreadPool(availableProcessors);
List<CompletableFuture> futures = new ArrayList<>();
long start = System.currentTimeMillis();
for (int i = 0; i < num; i++) {
int id = (i + 1) * num;
if(id <= count){
//futures.add(CompletableFuture.supplyAsync(() -> officeResponsibilityMapper.multithreadingGetData(id), executorService));
CompletableFuture.supplyAsync(() -> officeResponsibilityMapper.multithreadingGetData(id), executorService) ;
}
}
executorService.shutdown();
System.out.println("多執行緒查詢共用時間" + (System.currentTimeMillis() - start));
long start2 = System.currentTimeMillis();
officeResponsibilityMapper.selectAll();
System.out.println("單執行緒查詢共用時間" + (System.currentTimeMillis() - start2));
// List<Object> collect = futures.stream().map(CompletableFuture::join).collect(Collectors.toList());
}
public interface OfficeResponsibilityMapper extends Mapper<OfficeResponsibilityEntity> {
@Select("select * from office_responsibility where id <= #{id}" )
List<OfficeResponsibilityEntity> multithreadingGetData(@Param("id") Integer id);
}
輸出如下
這還是僅有300條資料,資料多了之後使用多執行緒查效率高的可不是一點點