溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

java多次嵌套循環(huán)查詢數(shù)據(jù)庫(kù)導(dǎo)致代碼中數(shù)據(jù)處理慢如何解決

發(fā)布時(shí)間:2023-03-15 14:37:39 來(lái)源:億速云 閱讀:139 作者:iii 欄目:開發(fā)技術(shù)

這篇文章主要介紹“java多次嵌套循環(huán)查詢數(shù)據(jù)庫(kù)導(dǎo)致代碼中數(shù)據(jù)處理慢如何解決”的相關(guān)知識(shí),小編通過(guò)實(shí)際案例向大家展示操作過(guò)程,操作方法簡(jiǎn)單快捷,實(shí)用性強(qiáng),希望這篇“java多次嵌套循環(huán)查詢數(shù)據(jù)庫(kù)導(dǎo)致代碼中數(shù)據(jù)處理慢如何解決”文章能幫助大家解決問(wèn)題。

    業(yè)務(wù)現(xiàn)象

    代碼中有一部分代碼多次嵌套循環(huán)和數(shù)據(jù)處理,執(zhí)行速度很慢

    解決方案

    通過(guò)多線程

    1、啟用多線程

    private final static Executor executor = Executors.newFixedThreadPool(3);

    2、初始化設(shè)置count

    即等待(await)count個(gè)線程或一個(gè)線程count次計(jì)數(shù),通過(guò)工作線程來(lái)countDown計(jì)數(shù)減一,直到計(jì)數(shù)為0,await阻塞結(jié)束;目的:保證所有線程都走完  

    final CountDownLatch latch = new CountDownLatch(dataList.size());

    3、需要重新run

    需要多線程的代碼寫在run中

     @Override
           public void run() { 
    
                    //業(yè)務(wù)代碼處理
    
                    //countDown計(jì)數(shù)減一
    
                     latch.countDown();
    
    }

    4、阻塞線程

      // 等待所有工作線程結(jié)束
                latch.await();

    關(guān)鍵代碼

     private final static Executor executor = Executors.newFixedThreadPool(3);//啟用多線程
     
     public Result getList(@RequestBody StatusDbSelectParam param){
     
    PageHelper.startPage(param.getPageNum(), param.getPageSize());
            List<Map<String, Object>> dataList = statusDbService.selectByTime(tableName,             columnNames.toString(), param.getStartTime(), param.getEndTime());
            //初始化設(shè)置count,即等待(await)count個(gè)線程或一個(gè)線程count次計(jì)數(shù),通過(guò)工作線程來(lái)countDown計(jì)數(shù)減一,直到計(jì)數(shù)為0,await阻塞結(jié)束
            final CountDownLatch latch = new CountDownLatch(dataList.size());
            for(int k =0;k<dataList.size();k++) {
                final int i = k;
                String finalTableName = tableName;
                executor.execute(new Runnable() {
                    @Override
                    public void run() {
                        try {
                            Map<String, Object> map = dataList.get(i);
                            for (String pid : map.keySet()) {
                                String val = String.valueOf(map.get(pid));
                                String columPid = pid.substring(2, pid.length()).toLowerCase();
                                List<MonitorRuleEntity> list = monitorRuleService.listMonitorRule(columPid, finalTableName);
                                String status = "";
                                //循環(huán)規(guī)則數(shù)據(jù) 判斷監(jiān)測(cè)點(diǎn)是否報(bào)警 更新狀態(tài)
                                for (int j = 0; j < list.size(); j++) {
                                    Boolean flag = DevHealthStatusFactory.getInstance().getResultMapByRule(val, list.get(j));
                                    if (flag) {
                                        if (j == 0) {
                                            status = "A";
                                            break;
                                        } else if (j == 1) {
                                            status = "B";
                                            break;
                                        } else if (j == 2) {
                                            status = "C";
                                            break;
                                        }
                                    }
                                }
                                if (pid.equalsIgnoreCase(timeColumnName)) {
                                    map.put(pid, val);
                                } else {
                                    map.put(pid, val + "_" + status);
                                }
                            }
                            latch.countDown();
                        } catch (Exception e) {
                            e.printStackTrace();
                        }
                    }
                });
            }
            try {
                // 等待所有工作線程結(jié)束
                latch.await();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            return ResultMsg.successMsg().data(new PageInfo<>(dataList));
        }

    關(guān)于“java多次嵌套循環(huán)查詢數(shù)據(jù)庫(kù)導(dǎo)致代碼中數(shù)據(jù)處理慢如何解決”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí),可以關(guān)注億速云行業(yè)資訊頻道,小編每天都會(huì)為大家更新不同的知識(shí)點(diǎn)。

    向AI問(wèn)一下細(xì)節(jié)

    免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

    AI