处理业务代码中循环遍历出现的性能问题

在开发中很多场景下我们都会用到foreach循环遍历一个list,并在内部通过sql再去查询对应的数据,代码如下

public void test(){
        // 获取知识点关联数据
        List<KnowledgeRelate> list = getKnowledgeRelate();

        for(KnowledgeRelate relate : list){
            // 执行 list.size() 次sql查询
            Knowledge knowledge = knowledgeService.getKnowledge(relate.getKnowledgeId());
            if(knowledge != null){
                relate.setName(knowledge.getKnowledgeName());
            }
        }
    }

如果是在单机并且数据量不大的情况下可能影响不大,但是在高并发高数据量的情况下如果还是用这种方法处理,就会出现系统奔溃的问题,原因在于多次请求数据库QPS到一定量时,容易导致数据库资源耗尽,可以去后台日志看看就会发现重复执行同个sql语句,这时我们可以用map去匹配处理,查询次数从list.size()降到1,代码如下

public void test(){
        // 获取知识点关联数据
        List<KnowledgeRelate> relateList = getKnowledgeRelate();

        Set<String> knowledgeSet = getKnowledgeInfo();
        Map<Long, String> knowledgeMap = Maps.newHashMap();
        // 获取知识点信息数据
        List<Knowledge> knowledgeList = knowledgeService.listByKnowledgeNames(knowledgeSet);
        // 判空处理
        if (CollectionUtil.isNotEmpty(knowledgeList)) {
            knowledgeMap = knowledgeList.stream()
                .collect(Collectors.toMap(Knowledge::getId, Knowledge::getKnowledgeName, (v1, v2) -> v1));
        }
        // 通过map设值
        for(KnowledgeRelate relate : relateList){
            relate.setName(knowledgeMap.get(relate.getKnowledgeId()));
        }
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值