一個曆史表中有大量的數據,現在要通過分頁式查詢處理轉換數據。
現在將處理數據的邏輯放在線程池中處理,以加快處理流程。
可是總是出現事務方麵的異常
比如 : 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 .....
}
}
邏輯先不說。
現在沒有判斷多執行緒是否全部執行完,while循環完就shutdown。 。 。
將CountDownLatch透過建構器傳入執行緒
分頁查詢是不並發(DAO)的,資料處理是並發(Service),所以你的事務級等級是設定在哪個環節呢?