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

前言

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

封装线程查询类

public class StatisticalUserBehaviorData implements Callable<List<Map<String, Object>>> {

    private DataDao dataDao;
    private Map<String,String> map;

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

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

外部调用

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

for (Future<List<Map<String, Object>>> future : submitList) {
	try {
		resultList.addAll(future.get());
	} catch (InterruptedException e) {
		e.printStackTrace();
	} catch (ExecutionException e) {
		e.printStackTrace();
	}
}

结果

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

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值