处理业务代码中循环遍历出现的性能问题
生活随笔
收集整理的這篇文章主要介紹了
处理业务代码中循环遍历出现的性能问题
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
在開(kāi)發(fā)中很多場(chǎng)景下我們都會(huì)用到foreach循環(huán)遍歷一個(gè)list,并在內(nèi)部通過(guò)sql再去查詢對(duì)應(yīng)的數(shù)據(jù),代碼如下
public void test(){// 獲取知識(shí)點(diǎn)關(guān)聯(lián)數(shù)據(jù)List<KnowledgeRelate> list = getKnowledgeRelate();for(KnowledgeRelate relate : list){// 執(zhí)行 list.size() 次sql查詢Knowledge knowledge = knowledgeService.getKnowledge(relate.getKnowledgeId());if(knowledge != null){relate.setName(knowledge.getKnowledgeName());}}}如果是在單機(jī)并且數(shù)據(jù)量不大的情況下可能影響不大,但是在高并發(fā)高數(shù)據(jù)量的情況下如果還是用這種方法處理,就會(huì)出現(xiàn)系統(tǒng)奔潰的問(wèn)題,原因在于多次請(qǐng)求數(shù)據(jù)庫(kù)QPS到一定量時(shí),容易導(dǎo)致數(shù)據(jù)庫(kù)資源耗盡,可以去后臺(tái)日志看看就會(huì)發(fā)現(xiàn)重復(fù)執(zhí)行同個(gè)sql語(yǔ)句,這時(shí)我們可以用map去匹配處理,查詢次數(shù)從list.size()降到1,代碼如下
public void test(){// 獲取知識(shí)點(diǎn)關(guān)聯(lián)數(shù)據(jù)List<KnowledgeRelate> relateList = getKnowledgeRelate();Set<String> knowledgeSet = getKnowledgeInfo();Map<Long, String> knowledgeMap = Maps.newHashMap();// 獲取知識(shí)點(diǎn)信息數(shù)據(jù)List<Knowledge> knowledgeList = knowledgeService.listByKnowledgeNames(knowledgeSet);// 判空處理if (CollectionUtil.isNotEmpty(knowledgeList)) {knowledgeMap = knowledgeList.stream().collect(Collectors.toMap(Knowledge::getId, Knowledge::getKnowledgeName, (v1, v2) -> v1));}// 通過(guò)map設(shè)值for(KnowledgeRelate relate : relateList){relate.setName(knowledgeMap.get(relate.getKnowledgeId()));}}總結(jié)
以上是生活随笔為你收集整理的处理业务代码中循环遍历出现的性能问题的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Navicat 远程连接docker容器
- 下一篇: 复杂度分析学习总结