java - 分頁查詢中如何使用多線程加快處理速度?
問題描述
一個歷史表中有大量的數據,現在要通過分頁式查詢處理轉換數據。
現在將處理數據的邏輯放在線程池中處理,以加快處理流程。
可是總是出現事務方面的異常
比如 : SQLNonTransientConnectionException
請問該如何解決上述異常,或者有什么好的多線程分頁查詢處理方案?
原來問題描述不太清楚,現在添加以下代碼(手敲,如果有錯,請多包含)
分頁式查詢邏輯:
int pageSize = 100;int currentPageLength = 0;int pageIndex = 0;ExecutorService exe = newFixedThreadPool(Runtime.getRuntime().availableProcessors());do { int offset = pageIndex * pageSize; List<TradeInfo> tradeInfos = tradeInfoService.findTradeInfoBysPage(queryParams,offset,pageSize); if (null != tradeInfos && tradeInfos.size() > 0) {currentPageLength = tradeInfos.size();TradeInfoProcesserTask task = new TradeInfoProcesserTask(tradeInfos );exe.execute(task);pageIndex++; }else{System.out.println('Page Query TradeInfo Got NOTHING! Break query loop!');break; }} while (currentPageLength == pageSize);exe.shutdown();while(true) { if(exe.isTerminated()){doOtherThings();System.out.println('分頁式多線程處理數據完畢!');break; }}
數據處理邏輯:
public class TradeInfoProcesserTask implements Runnable{ private volatile List<TradeInfo> tradeInfos;public TradeInfoProcesserTask (List<TradeInfo> _tradeInfos){tradeInfos = _tradeInfos; }@Override public void run() {processTradeInfos(); }private void processTradeInfos(){//do something with tradeInfos ..... }}
問題解答
回答1:邏輯先不說。現在沒有判斷多線程是否全部執行完,while循環完就shutdown。。。將CountDownLatch通過構造器傳入線程
ExecutorService exe = newFixedThreadPool(Runtime.getRuntime().availableProcessors());CountDownLatch latch = new CountDownLatch(?); //?代表開啟全部線程的數量do { int offset = pageIndex * pageSize; List<TradeInfo> tradeInfos = tradeInfoService.findTradeInfoBysPage(queryParams,offset,pageSize); if (null != tradeInfos && tradeInfos.size() > 0) {currentPageLength = tradeInfos.size();TradeInfoProcesserTask task = new TradeInfoProcesserTask(tradeInfos, latch);exe.execute(task);pageIndex++; }else{System.out.println('Page Query TradeInfo Got NOTHING! Break query loop!');break; }} while (currentPageLength == pageSize);latch.await(); //多線程全部執行完exe.shutdown();doOtherThings();System.out.println('分頁式多線程處理數據完畢!');
public class TradeInfoProcesserTask implements Runnable{ private volatile List<TradeInfo> tradeInfos; private CountDownLatch latch;public TradeInfoProcesserTask (List<TradeInfo> _tradeInfos, CountDownLatch latch){tradeInfos = _tradeInfos;this.latch = latch; }@Override public void run() {processTradeInfos();latch.countDown(); }private void processTradeInfos(){//do something with tradeInfos ..... }}回答2:
分頁查詢是不并發(DAO)的,數據處理是并發(Service),所以你的事務級級別是設置在哪個環節呢?
相關文章:
1. angular.js - 各位大神們,你們混合開發,web方式中更推薦用什么框架呀? react?vue?angular?謝謝~2. angular.js - angularjs的自定義過濾器如何給文字加顏色?3. angular.js使用$resource服務把數據存入mongodb的問題。4. docker-machine添加一個已有的docker主機問題5. javascript - IOS微信audio標簽不能通過touchend播放6. PHP類中的$this7. 老師百度網盤分享一下WampServer的包啊,我們下載幾kb要下載一天的.8. html5 - vuex 為什么需要action,我發現進行異步操作回調中直接操作mutation也沒有報錯9. java-ee - nginx做前端服務器,tomcat+apache做后端,那么war部署在哪里?10. 前端 - 集思廣益,如何用CSS實現數字上面有一個點
