多线程执行 sql查询 提升整体查询效率

对于复杂的业务sql查询,可以考虑如下建议。


1.先通过sql查询出主表信息列表list.
2.for循环list,补充查询主表对应的子表信息。
3.在2的步骤中,可以使用多线程处理for查询。



可以参考如下:

其中conList 是查询主表返回的list

//线程池初始化
ThreadPoolExecutor executor = ThreadPool.getThreadPool(5,8, 3000, TimeUnit.SECONDS, new LinkedBlockingQueue(2000));
//得到线程池中线程队列
LinkedBlockingQueue queue = (LinkedBlockingQueue) executor.getQueue();
int countTool= conList.size();
final CountDownLatch countDownLatch = new CountDownLatch(countTool);
for(int i=0;i < countTool;i++){
final Map tempMap = (Map) conList.get(i);
String contractNo = (String) tempMap.get("CONTRACTNO");
String workflowId = (String) tempMap.get("WORKFLOWID");
params.put("WORKFLOWID", workflowId); //工作流
final IbatisDao dao=new IbaitsDaoImpl();
//防止 params 被重复引用 需要重新 new 对象 并使用该new 对象
final Map myParam = new HashMap();
myParam.putAll(params);

//向线程池 放入待处理的任务信息 使用内部类进行 查询
executor.execute(new Runnable(){
public void run() {
//统计审核次数
try {
Map auditMap = (Map) dao.queryObjectBySql("QUERY_AUDIT_NUM_BY_WORKFLOWID",myParam);
tempMap.put("AUDITNAME",auditMap.get("AUDITNAME"));
tempMap.put("AUDITNUM",auditMap.get("AUDITNUM"));
//查询审核时间
auditMap = (Map) dao.queryObjectBySql("QUERY_AUDIT_TIME_BY_WORKFLOWID",myParam);
tempMap.put("AUDITTIME",auditMap.get("AUDITTIME"));
} catch (SQLException e) {
e.printStackTrace();
}
//线程计数器 减 1
countDownLatch.countDown();
}

});
}
//所有子线程 执行完成之后 主线程再继续向下
countDownLatch.await();
System.out.println("-------------query end------");
?

你可能感兴趣的:(多线程执行 sql查询 提升整体查询效率)