利用Callable进行多线程查询数据,提高数据查询效率

前言

最近在公司碰到这么一个需求,需要去1000多个数据库中统计数据,每次统计数据库中10多张表,当我们同事写出代码后,由于单线程去执行,效率有点慢,所以想出用多线程进行查询,这样以来可以提升一下查询效率。代码如下。

封装线程查询类

public class StatisticalUserBehaviorData implements Callable>> {

    private DataDao dataDao;
    private Map map;

    //利用构造函数,将相关参数穿进来
    public StatisticalUserBehaviorData(Map map, DataDao dataDao){
        this.map=map;
        this.dataDao=dataDao;
    }

    @Override
    public List> call() throws Exception {
	    List> resultList = new ArrayList<>();
        //此处写具体的业务查询代码,可以查询数据库,也可以查询远程服务
		resultList.add("这里是相关业务的查询结果");
        return resultList;
    }
   
}

外部调用

//汇总查询后的结果
List> resultList = new ArrayList<>();
List>>> submitList = new ArrayList<>();
for (Map map : projectList) {
    //ExecutorService 是自己封装的线程池对象
	submitList.add(ExecutorService.submit(new StatisticalUserBehaviorData(map,dataDao))); 
}

for (Future>> future : submitList) {
	try {
		resultList.addAll(future.get());
	} catch (InterruptedException e) {
		e.printStackTrace();
	} catch (ExecutionException e) {
		e.printStackTrace();
	}
}

结果

相比单线程执行的效率,多线程执行比单线程提升了5倍多,具体业务逻辑代码大家可以根据自己的场景自己写,比如查询多个服务,查询多张表,查询多个库等等。

你可能感兴趣的:(1,JavaEE)