1. 程式人生 > 其它 >資料量大時使用多執行緒查詢mysql資料和單執行緒對比

資料量大時使用多執行緒查詢mysql資料和單執行緒對比

技術標籤: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條資料,資料多了之後使用多執行緒查效率高的可不是一點點