java使用多執行緒及分頁查詢資料量很大的資料
阿新 • • 發佈:2019-02-11
主要的思路就是:
先通過count查出結果集的總條數,設定每個執行緒分頁查詢的條數,通過總條數和單次條數得到執行緒數量,通過改變limit的下標實現分批查詢。
呼叫方法:
import org.springframework.beans.factory.annotation.Autowired; import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.concurrent.Callable; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Future; public class QueryTest { @Autowired Object myService; public List<Map<String, Object>> getMaxResult(String sex) throws Exception{ long start = System.currentTimeMillis(); List<Map<String, Object>> result=new ArrayList<>();//返回結果 int count = 20000005;//mydao.getCount(); 通過count查到資料總量 int num = 10000;//每次查詢的條數 //需要查詢的次數 int times=count / num; if(count%num !=0) { times=times+1; } //開始查詢的行數 int bindex = 0; List<Callable<List<Map<String, Object>>>> tasks = new ArrayList<Callable<List<Map<String, Object>>>>();//新增任務 for(int i = 0; i <times ; i++){ Callable<List<Map<String, Object>>> qfe = new ThredQuery(myService,sex,bindex, num); tasks.add(qfe); bindex=bindex+num; } //定義固定長度的執行緒池 防止執行緒過多 ExecutorService execservice = Executors.newFixedThreadPool(15); List<Future<List<Map<String, Object>>>> futures = execservice.invokeAll(tasks); // 處理執行緒返回結果 if (futures != null && futures.size() > 0) { for(Future<List<Map<String, Object>>> future : futures) { result.addAll(future.get()); } } execservice.shutdown(); // 關閉執行緒池 long end = System.currentTimeMillis(); System.out.println("用時"+(start-end)); return result; } }
執行緒類:
import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.concurrent.Callable; public class ThredQuery implements Callable<List<Map<String, Object>>> { private Object myService;//需要通過夠早方法把對應的業務service傳進來 實際用的時候把型別變為對應的型別 private String sex;//查詢條件 根據條件來定義該類的屬性 private int bindex;//分頁index private int num;//數量 /** * 重新構造方法 * @param myService * @param sex * @param bindex * @param num */ public ThredQuery(Object myService,String sex,int bindex,int num){ this.myService=myService; this.sex=sex; this.bindex=bindex; this.num=num; } @Override public List<Map<String, Object>> call() throws Exception { //通過service查詢得到對應結果 List<Map<String, Object>> list =new ArrayList<>(); //myService.queryBySex(sex,bindex,num); return list; } }