場景
從數據庫查詢信息,分批查詢,50000個查詢一次,再把每次查詢結果彙總,若是分10次查詢,正常查詢每次返List<Product>,要等前一次查詢返回結果後,才能執行下一次查詢,彙總結果,是同步執行的過程。試想若是能夠同時進行查詢,之間互不影響,每一個查詢返回結構後,直接彙總,這樣就大大節約了查詢時間。 AsyncResult做用就在這裏。java
借用舉例
AsyncResult是異步方式,異步主要用於調用的代碼須要長時間運行,才能返回結果的時候,能夠不阻塞調用者。數據庫
打個比方,同步方式就是你打電話給客服,客服無法馬上解決,客服說你等等,別掛電話,而後等了10分鐘,再告訴你。再掛電話。
此時電話費照收,而且你不能接打別人的電話。app
異步方式就是,客服說,我先查查,查到了給你回電話,而後掛斷。你幹別的事情。等了10分鐘,客服給你來電話了,告訴你結果。異步
代碼
1,分批查詢async
@Override public Integer selectListCount(StorageFeeChargePageCommand command, Integer status,String key) throws Exception { Example example= conditions(command,status); int count = tgStorageFeeChargeMapper.selectCountByExample(example); int rowMaxCount = 50000; //分批查詢 int tempsize = (count % rowMaxCount) == 0 ? count / rowMaxCount : count / rowMaxCount + 1; //分頁數據對象轉換 List<StorageFeeCharge> list = new ArrayList<>(); int listSize =0; ArrayList<Future<List<StorageFeeCharge>>> ret = new ArrayList<Future<List<StorageFeeCharge>>>(); //分批查詢 for (int i = 0; i < tempsize; i++) { int pageNum =i+1; Future<List<StorageFeeCharge>> asyncResult1 = storageCommonApplication.asynchronousGetSFeeCharge(pageNum,rowMaxCount,example,key); ret.add(asyncResult1); } int num = 0; //獲取返回結果 for (Future<List<StorageFeeCharge>> result : ret){ List<StorageFeeCharge> s = result.get(); listSize += s.size(); s.clear(); } return listSize; }
2,異步查詢ide
@Async public Future<List<StorageFeeCharge>> asynchronousGetSFeeCharge(int pageNum, int rowMaxCount, Example example,String key){ //分頁數據對象轉換 List<StorageFeeCharge> list = new ArrayList<>(); PageWrap<StorageFeeCharge> pageList = new PageWrap<StorageFeeCharge>(); Page<TgStorageFeeCharge> page = PageUtil.startPage(pageNum,rowMaxCount); list = storageCommonRepository.selectPageList( pageNum, rowMaxCount, example); saveRedis(list, key); return new AsyncResult(list); }