HANTE преди 2 месеца
родител
ревизия
b527d645e3
променени са 25 файла, в които са добавени 515 реда и са изтрити 212 реда
  1. 2 1
      conf/utic-traf-server-trace.cfg
  2. 1 0
      conf/utic-traf-server.pid
  3. 1 1
      utic-traf-server/src/main/java/com/utic/center/utic/traf/server/UticTrafServerApplication.java
  4. 40 17
      utic-traf-server/src/main/java/com/utic/center/utic/traf/server/controller/UticTrafServerController.java
  5. 29 33
      utic-traf-server/src/main/java/com/utic/center/utic/traf/server/controller/UticTrafServerRestController.java
  6. 7 5
      utic-traf-server/src/main/java/com/utic/center/utic/traf/server/dao/repository/dwdb/DwdbTrafficRepository.java
  7. 22 19
      utic-traf-server/src/main/java/com/utic/center/utic/traf/server/dto/BatchJobInfoDto.java
  8. 1 4
      utic-traf-server/src/main/java/com/utic/center/utic/traf/server/dto/LinkDto.java
  9. 3 0
      utic-traf-server/src/main/java/com/utic/center/utic/traf/server/dto/LinkMissingValueHistDto.java
  10. 5 0
      utic-traf-server/src/main/java/com/utic/center/utic/traf/server/dto/LinkTrafFusionInfo.java
  11. 1 1
      utic-traf-server/src/main/java/com/utic/center/utic/traf/server/dto/LinkTrafVal.java
  12. 6 5
      utic-traf-server/src/main/java/com/utic/center/utic/traf/server/repository/ApplicationRepository.java
  13. 1 1
      utic-traf-server/src/main/java/com/utic/center/utic/traf/server/service/LinkPatternService.java
  14. 10 3
      utic-traf-server/src/main/java/com/utic/center/utic/traf/server/service/LinkService.java
  15. 2 5
      utic-traf-server/src/main/java/com/utic/center/utic/traf/server/service/LinkTrafFusionService.java
  16. 139 3
      utic-traf-server/src/main/java/com/utic/center/utic/traf/server/service/LinkTrafPrcsAfterService.java
  17. 9 6
      utic-traf-server/src/main/java/com/utic/center/utic/traf/server/service/LinkTrafPrcsInitService.java
  18. 2 2
      utic-traf-server/src/main/java/com/utic/center/utic/traf/server/service/LinkTrafPrcsPrepareService.java
  19. 200 38
      utic-traf-server/src/main/java/com/utic/center/utic/traf/server/service/LinkTrafSaveDwdbService.java
  20. 0 3
      utic-traf-server/src/main/java/com/utic/center/utic/traf/server/service/worker/LinkTrafSaveCacheWorker.java
  21. 17 11
      utic-traf-server/src/main/java/com/utic/center/utic/traf/server/service/worker/LinkTrafSaveDwdbCenterHistWorker.java
  22. 0 40
      utic-traf-server/src/main/java/com/utic/center/utic/traf/server/service/worker/LinkTrafSaveDwdbFusionLogWorker.java
  23. 13 10
      utic-traf-server/src/main/java/com/utic/center/utic/traf/server/service/worker/LinkTrafSaveDwdbMissingValueHistWorker.java
  24. 1 1
      utic-traf-server/src/main/resources/logback-spring.xml
  25. 3 3
      utic-traf-server/src/main/resources/mybatis/mapper/dwdb/DwdbTrafficMapper.xml

+ 2 - 1
conf/utic-traf-server-trace.cfg

@@ -1 +1,2 @@
-DEBUG=
+debug=false
+linkIds=1960162800,1960163000

+ 1 - 0
conf/utic-traf-server.pid

@@ -0,0 +1 @@
+17988

+ 1 - 1
utic-traf-server/src/main/java/com/utic/center/utic/traf/server/UticTrafServerApplication.java

@@ -59,7 +59,7 @@ public class UticTrafServerApplication implements CommandLineRunner, Application
         log.info("");
         log.info("************************************************************************************");
         log.info("**                                                                                **");
-        log.info("**                          UTIC Center PTIS System                               **");
+        log.info("**                          UTIC Center TRAF System                               **");
         log.info("**               UTIC Center ITS Traffic Processing Server Program.               **");
         log.info("**                                                                                **");
         log.info("**                                                                   [ver.1.0]    **");

+ 40 - 17
utic-traf-server/src/main/java/com/utic/center/utic/traf/server/controller/UticTrafServerController.java

@@ -17,20 +17,19 @@ import java.time.LocalDateTime;
 @RequiredArgsConstructor
 public class UticTrafServerController {
 
-    private final LinkTrafProcessService service;
+    private final LinkTrafPrcsInitService prcsInitService;
+    private final LinkTrafPrcsPrepareService prepareService;
+    private final LinkTrafPrcsAfterService prcsAfterService;
+
     private final LinkTrafAsnService asnService;
 
-    private final LinkTrafSaveCenterService trafCenterService;
 
     private final LinkTrafCollectService collectService;
     private final LinkTrafFusionService fusionService;
     private final LinkTrafMissingService missingService;
-    private final LinkTrafSaveCacheService saveService;
-
-    private final LinkPrepareService prepareService;
-    private final LinkTrafPrcsAfterService afterService;
-
-//    private final LinkCollectMoctRepository moctRepo;
+    private final LinkTrafSaveCacheService saveCacheService;
+    private final LinkTrafSaveCenterService saveCenterService;
+    private final LinkTrafSaveDwdbService saveDwdbService;
 
     private String prevPrcsTime;
     private boolean isRunning = false;
@@ -50,6 +49,7 @@ public class UticTrafServerController {
 
     public void run() {
         final long start = System.currentTimeMillis();
+        long tmpStart;
         calculateTime();
         if (this.minute % 5 != 0) { // 5분마다 실행
             return;
@@ -68,36 +68,59 @@ public class UticTrafServerController {
         BatchJobInfoDto jobInfo = new BatchJobInfoDto(TimeUtils.now());
 
         try {
-            if (!this.service.initialize()) {
-                return; // 초기화 실패시 종료
-            }
+            // 0. 가공 초기화 작업
+            this.prcsInitService.processing();
 
             // 1. ASN 교통정보 이관(TRAFFIC_LOC) 작업
             this.asnService.processing();
+            jobInfo.setAsnEtlpTime(System.currentTimeMillis() - start);
 
             // 2. 수집원별 링크 원시 교통정보 조회
+            tmpStart = System.currentTimeMillis();
             this.collectService.processing();
+            jobInfo.setCollectTime(System.currentTimeMillis() - tmpStart);
 
             // 2. 가공방식에 따른 퓨전 소통정보 생성
+            tmpStart = System.currentTimeMillis();
             this.fusionService.processing();
+            jobInfo.setFusionTime(System.currentTimeMillis() - tmpStart);
 
             // 3. 결측처리
+            tmpStart = System.currentTimeMillis();
             this.missingService.processing();
+            jobInfo.setMissingTime(System.currentTimeMillis() - tmpStart);
 
             // 4. 소통정보 저장(TRAFFIC_CENTER_CACHE) 작업
-            this.saveService.processing();
+            tmpStart = System.currentTimeMillis();
+            this.saveCacheService.processing();
+            jobInfo.setSaveCacheTime(System.currentTimeMillis() - tmpStart);
 
             // 5. 소통정보 저장(TRAFFIC_CENTER_CACHE ==> TRAFFIC_CENTER) 작업
-            this.trafCenterService.processing();
+            tmpStart = System.currentTimeMillis();
+            this.saveCenterService.processing();
+            jobInfo.setSaveCenterTime(System.currentTimeMillis() - tmpStart);
+            jobInfo.setSaveTrafficTime(System.currentTimeMillis() - start);
+            log.info("##>> 05MIN {}", LogUtils.elapsedLogLength("정주기 교통정보 저장 완료", jobInfo.getSaveTrafficTime(), 5));
+
+            // 6. DWDB 저장
+            tmpStart = System.currentTimeMillis();
+            this.saveDwdbService.processing();
+            jobInfo.setSaveDwdbTime(System.currentTimeMillis() - tmpStart);
+
+            // 7. 가공 기초정보 로딩 및 가공 후 처리
+            tmpStart = System.currentTimeMillis();
+            this.prepareService.processing();
+            jobInfo.setPrepareTime(System.currentTimeMillis() - tmpStart);
+
+            // 8. 가공 후 처리
+            tmpStart = System.currentTimeMillis();
+            this.prcsAfterService.processing();
+            jobInfo.setPrcsAfterTime(System.currentTimeMillis() - tmpStart);
         }
         finally {
             this.isRunning = false; // 현재 작업이 종료됨을 표시
         }
 
-        this.prepareService.processing(); // 가공 기초정보 로딩
-
-        this.afterService.processing(); // 가공 후 처리
-
         // 작업 정보를 리스트에 저장(http://localhost:9871/info)
         long executionTime = System.currentTimeMillis() - start;
         jobInfo.setEndTime(TimeUtils.now());

+ 29 - 33
utic-traf-server/src/main/java/com/utic/center/utic/traf/server/controller/UticTrafServerRestController.java

@@ -1,7 +1,10 @@
 package com.utic.center.utic.traf.server.controller;
 
+import com.utic.center.common.utils.LogUtils;
 import com.utic.center.common.utils.TimeUtils;
 import com.utic.center.utic.traf.server.config.ApplicationConfig;
+import com.utic.center.utic.traf.server.dto.BatchJobInfoDto;
+import com.utic.center.utic.traf.server.repository.ApplicationRepository;
 import lombok.RequiredArgsConstructor;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
@@ -17,47 +20,40 @@ public class UticTrafServerRestController {
     @GetMapping(value = "/info", produces = {"application/json; charset=utf8"})
     public String stringInfo() {
         String sep = System.lineSeparator();
-        String heading = "-------------------------------------------------------------------------------------------------------------------------------------";
-
-//        RegionCenter center = ApplicationRepository.center;
+        String heading = "----------------------------------------------------------------------------------------------------------------------------------------------------------";
 
         StringBuilder sb = new StringBuilder();
         sb.append(heading).append(sep);
-        sb.append("UTIC Local Signal Communication Server").append(sep);
+        sb.append("UTIC Center ITS Traffic Processing Server").append(sep);
         sb.append(heading).append(sep);
         sb.append(String.format("Process Id: %s, %s, %s", this.config.getProcessId(), this.config.getBootingTime(), TimeUtils.now())).append(sep);
         sb.append(heading).append(sep);
-//        sb.append(String.format("%s, %s", center.getRegionCd(), center.getIpAddress())).append(sep);
-        sb.append(heading).append(sep);
-        sb.append("SEQ REGION   IP Address      Network  Connect Time         Disconnect Time      Last Comm Time       Connected [TOD]  Center Name").append(sep);
+        sb.append(String.format("%s %-20.20s %-20.20s    TOTAL ASN_ETLP  COLLECT   FUSION  MISSING    CACHE   CENTER  TRAFFIC     DWDB  PREPARE    AFTER",
+                " SEQ", "Start", "End")).append(sep);
         sb.append(heading).append(sep);
         int total = 0;
-        int onLine = 0;
-        int ii = 1;
-//        List<String> keySet = new ArrayList<>(this.repo.getCenterMap().keySet());
-//        Collections.sort(keySet);
-//        DecimalFormat dF = new DecimalFormat("#,###");
-//        for (String key : keySet) {
-//            RegionCenter region = this.repo.getCenterMap().get(key);
-//            if (region == null) {
-//                continue;
-//            }
-//            total++;
-//            String commStatus = "Closed";
-//            String tod = region.isSimulateFlag() ? " YES " : " NO  ";
-////            sb.append(String.format("%3d %-6.6s   %-15.15s %-8.8s %-20.20s %-20.20s %-20.20s %9s %s  %s",
-////                    ii++,
-////                    region.getRegionCd(), region.getIpAddress(), commStatus,
-////                    region.getNetState().getConnectTimeString(), region.getNetState().getDisconnectTimeString(),
-////                    region.getNetState().getLastCommTimeString(),
-////                    dF.format(region.getConnectCount()),
-////                    tod,
-////                    region.getRegionNm()))
-////                    .append(sep);
-//
-//        }
-        sb.append(heading).append(sep);
-        sb.append(String.format("Total : %d, OnLine(Connect): %d", total, onLine)).append(sep);
+
+        int jobSize = ApplicationRepository.batchJobInfoList.size();
+        for (int ii = jobSize-1; ii >= 0; ii--) {
+            BatchJobInfoDto jobInfo = ApplicationRepository.batchJobInfoList.get(ii);
+            total++;
+
+            sb.append(String.format("%4d %-20.20s %-20.20s %s %s %s %s %s %s %s %s %s %s %s",
+                    total,
+                    jobInfo.getStartTime(), jobInfo.getEndTime(),
+                    LogUtils.numberLog(jobInfo.getElapsedTime()),
+                    LogUtils.numberLog(jobInfo.getAsnEtlpTime()),
+                    LogUtils.numberLog(jobInfo.getCollectTime()),
+                    LogUtils.numberLog(jobInfo.getFusionTime()),
+                    LogUtils.numberLog(jobInfo.getMissingTime()),
+                    LogUtils.numberLog(jobInfo.getSaveCacheTime()),
+                    LogUtils.numberLog(jobInfo.getSaveCenterTime()),
+                    LogUtils.numberLog(jobInfo.getSaveTrafficTime()),
+                    LogUtils.numberLog(jobInfo.getSaveDwdbTime()),
+                    LogUtils.numberLog(jobInfo.getPrepareTime()),
+                    LogUtils.numberLog(jobInfo.getPrcsAfterTime())
+                    )).append(sep);
+        }
         sb.append(heading).append(sep);
         return sb.toString();
     }

+ 7 - 5
utic-traf-server/src/main/java/com/utic/center/utic/traf/server/dao/repository/dwdb/DwdbTrafficMapperImpl.java → utic-traf-server/src/main/java/com/utic/center/utic/traf/server/dao/repository/dwdb/DwdbTrafficRepository.java

@@ -10,18 +10,20 @@ import org.springframework.stereotype.Repository;
 
 @Repository
 @RequiredArgsConstructor
-public class DwdbTrafficMapperImpl {
+public class DwdbTrafficRepository {
     
     private final DwdbTrafficMapper mapper;
 
-    @SqlOperation(type = SqlOperation.SqlType.INSERT, table = "TRAFFIC_CENTER_HIST")
-    public int insertTrafficCenterHist(LinkTrafCenterDto obj) {
-        return this.mapper.insertTrafficCenterHist(obj);
-    }
     @SqlOperation(type = SqlOperation.SqlType.INSERT, table = "LINK_FUSION_LOG")
     public int insertLinkFusionLog(LinkTrafFusionInfo obj) {
         return this.mapper.insertLinkFusionLog(obj);
     }
+
+    @SqlOperation(type = SqlOperation.SqlType.INSERT, table = "TRAFFIC_CENTER_HIST")
+    public int insertTrafficCenterHist(LinkTrafCenterDto obj) {
+        return this.mapper.insertTrafficCenterHist(obj);
+    }
+
     @SqlOperation(type = SqlOperation.SqlType.INSERT, table = "LINK_MISSING_VALUE_HIST")
     public int insertLinkMissingValueHist(LinkMissingValueHistDto obj) {
         return this.mapper.insertLinkMissingValueHist(obj);

+ 22 - 19
utic-traf-server/src/main/java/com/utic/center/utic/traf/server/dto/BatchJobInfoDto.java

@@ -14,29 +14,32 @@ public class BatchJobInfoDto implements Serializable {
 
     private String startTime;  // 작업 시작 시각
     private String endTime;    // 작업 종료 시각
+
     private long elapsedTime; // 작업 소요 시간 (밀리초 단위)
-    private int traf;
-    private int evnt;
-    private int incd;
-    private int totTraf;
-    private int totEvnt;
-    private int totIncd;
-    private String trafDate; // 교통 정보 최종 등록 시각
-    private String evntDate; // 사고/공사 정보 최종 등록 시각
-    private String incdDate; // 돌발 정보 최종 등록 시각
+    private long asnEtlpTime; // ASN 작업 소요 시간 (밀리초 단위)
+    private long collectTime; // 수집 작업 소요 시간 (밀리초 단위)
+    private long fusionTime;  // 융합 작업 소요 시간 (밀리초 단위)
+    private long missingTime; // 결손 작업 소요 시간 (밀리초 단위)
+    private long saveCacheTime; // 캐시 저장 작업 소요 시간 (밀리초 단위)
+    private long saveCenterTime; // 센터 저장 작업 소요 시간 (밀리초 단위)
+    private long saveTrafficTime; // 교통정보 저장 작업 소요 시간 (밀리초 단위)
+    private long saveDwdbTime;   // DWDB 저장 작업 소요 시간 (밀리초 단위)
+    private long prepareTime;    // 가공 준비 작업 소요 시간 (밀리초 단위)
+    private long prcsAfterTime;  // 가공 후 작업 소요 시간 (밀리초 단위)
 
     public BatchJobInfoDto(String startTime) {
         this.startTime = startTime;
         this.endTime = startTime; // 초기화 시 시작 시간과 동일하게 설정
-        this.elapsedTime = 0; // 초기화 시 소요 시간은 0
-        this.traf = 0; // 초기화 시 교통 정보 카운트는 0
-        this.evnt = 0; // 초기화 시 사고/공사 정보 카운트는 0
-        this.incd = 0; // 초기화 시 돌발 정보 카운트는 0
-        this.totTraf = 0; // 초기화 시 총 교통 정보 카운트는 0
-        this.totEvnt = 0; // 초기화 시 총 사고/공사 정보 카운트는 0
-        this.totIncd = 0; // 초기화 시 총 돌발 정보 카운트는 0
-        this.trafDate = ""; // 초기화 시 교통 정보 최종 등록 시각은 0
-        this.evntDate = ""; // 초기화 시 사고/공사 정보 최종 등록 시각은 0
-        this.incdDate = ""; // 초기화 시 돌발 정보 최종 등록 시각
+        this.elapsedTime = 0; // 작업 소요 시간 (밀리초 단위)
+        this.asnEtlpTime = 0; // ASN 작업 소요 시간 (밀리초 단위)
+        this.collectTime = 0; // 수집 작업 소요 시간 (밀리초 단위)
+        this.fusionTime = 0;  // 융합 작업 소요 시간 (밀리초 단위)
+        this.missingTime = 0; // 결손 작업 소요 시간 (밀리초 단위)
+        this.saveCacheTime = 0; // 캐시 저장 작업 소요 시간 (밀리초 단위)
+        this.saveCenterTime = 0; // 센터 저장 작업 소요 시간 (밀리초 단위)
+        this.saveTrafficTime = 0; // 교통정보 저장 작업 소요 시간 (밀리초 단위)
+        this.saveDwdbTime = 0;   // DWDB 저장 작업 소요 시간 (밀리초 단위)
+        this.prepareTime = 0;    // 가공 준비 작업 소요 시간 (밀리초 단위)
+        this.prcsAfterTime = 0; // 가공 후 작업 소요 시간 (밀리초 단위)
     }
 }

+ 1 - 4
utic-traf-server/src/main/java/com/utic/center/utic/traf/server/dto/LinkDto.java

@@ -32,12 +32,9 @@ public class LinkDto  implements Serializable {
 
     private boolean prcsPtrnMissing;    // 패턴 결측 처리 여부(링크 레벨1 인 경우)
 
-    private LinkTrafPtrn trafPtrn;      // 현재 주기 패턴값
-
     private LinkTrafVal trafFsn;        // 퓨전 소통정보
-
+    private LinkTrafPtrn trafPtrn;      // 현재 주기 패턴값
     private LinkTrafMiss missPsd;       // PSD 알고리즘 수행 값
-
     private LinkTrafCenterDto trafCenter; // 소통정보 센터 전송 DTO
 
     public void init() {

+ 3 - 0
utic-traf-server/src/main/java/com/utic/center/utic/traf/server/dto/LinkMissingValueHistDto.java

@@ -45,6 +45,9 @@ public class LinkMissingValueHistDto implements Serializable {
         this.linkPatnSpd = 0;
         this.missingType = "";
         this.revisionSpd = 0;
+        this.l4LinkId = "";
+        this.upLinkId = "";
+        this.dnLinkId = "";
         this.psdSpeed = 0;
         this.knnSpeed = 0;
         this.knnCnt = 0;

+ 5 - 0
utic-traf-server/src/main/java/com/utic/center/utic/traf/server/dto/LinkTrafFusionInfo.java

@@ -47,6 +47,11 @@ public class LinkTrafFusionInfo implements Serializable {
         init();
     }
 
+    public void init(String regDate) {
+        this.regDate = regDate;
+        init();
+    }
+
     public void init() {
         this.prcsType = 0;
         this.linkCnt = 0;

+ 1 - 1
utic-traf-server/src/main/java/com/utic/center/utic/traf/server/dto/LinkTrafVal.java

@@ -21,7 +21,7 @@ public class LinkTrafVal implements Serializable {
 
     public void init() {
         this.state.init();
-        this.centerId = "C00";
+        //this.centerId = "C00";
         this.speed = 0;
         this.travelTime = 0;
     }

+ 6 - 5
utic-traf-server/src/main/java/com/utic/center/utic/traf/server/repository/ApplicationRepository.java

@@ -4,7 +4,6 @@ import com.utic.center.common.dto.ProcessStateDto;
 import com.utic.center.utic.traf.server.dto.BatchJobInfoDto;
 import com.utic.center.utic.traf.server.dto.TrafPrcsTimeDto;
 import lombok.Getter;
-import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 
 import java.util.ArrayList;
@@ -12,15 +11,17 @@ import java.util.List;
 
 @Slf4j
 @Getter
-@RequiredArgsConstructor
 public class ApplicationRepository {
 
     public static final String TABLE_TRAFFIC_CENTER_CACHE = "TRAFFIC_CENTER_CACHE";
     public static final String TABLE_TRAFFIC_CENTER = "TMP_TRAFFIC_CENTER";
-    public static final String TABLE_TRAFFIC_CENTER_HIST = "TRAFFIC_CENTER_HIST@DWDB";
-    public static final String TABLE_LINK_MISSING_VALUE_HIST = "LINK_MISSING_VALUE_HIST@DWDB";
-    public static final String TABLE_LINK_FUSION_LOG = "LINK_FUSION_LOG@DWDB";
+    public static final String TABLE_TRAFFIC_CENTER_HIST = "TMP_TRAFFIC_CENTER_HIST@DWDB";
+    public static final String TABLE_LINK_MISSING_VALUE_HIST = "TMP_LINK_MISSING_VALUE_HIST@DWDB";
+    public static final String TABLE_LINK_FUSION_LOG = "TMP_LINK_FUSION_LOG@DWDB";
 
+    private ApplicationRepository() {
+        throw new IllegalStateException("ApplicationRepository class");
+    }
 
     public static final ProcessStateDto processState = ProcessStateDto.builder()
             .processId("70030")

+ 1 - 1
utic-traf-server/src/main/java/com/utic/center/utic/traf/server/service/LinkPatternService.java

@@ -115,7 +115,7 @@ public class LinkPatternService implements AbstractProcessService {
         // 링크레벨1, 레벨4 패턴 속도 설정(테이블에 레벨1, 레벨4만 존재)
         int link1Count = 0;
         for (LinkPtrnVal ptrnVal : result) {
-            LinkDto link = this.linkService.getLinkMap().get(ptrnVal.getLinkId());
+            LinkDto link = this.linkService.getLink(ptrnVal.getLinkId());
             if (link == null) {
                 continue;
             }

+ 10 - 3
utic-traf-server/src/main/java/com/utic/center/utic/traf/server/service/LinkService.java

@@ -193,10 +193,15 @@ public class LinkService implements AbstractProcessService {
                 missLinks.size(), missCount);
         return true;
     }
-
     public void initLinkTraf() {
+        this.linkMap.values().parallelStream()
+                .forEach(LinkDto::initTraf);
+    }
+
+    public void initLinkTrafParallel() {
 //        this.linkMap.values().parallelStream()
 //                .forEach(LinkDto::initTraf);
+// 병렬처리로 링크 트래픽 초기화
 //        CompletableFuture<Void> fsnFuture = CompletableFuture.runAsync(() -> {
 //            this.linkMap.values().parallelStream().forEach(link -> {
 //                link.getTrafFsn().init();
@@ -226,7 +231,6 @@ public class LinkService implements AbstractProcessService {
         });
         CompletableFuture.allOf(fsnFuture, psdFuture, centerFuture).join();
 
-
 //        ExecutorService executor = Executors.newFixedThreadPool(100); // 병렬 스레드 수 조절
 //        List<CompletableFuture<Void>> fsnFutures = linkMap.values().stream()
 //                .map(link -> CompletableFuture.runAsync(() -> link.getTrafFsn().init(), executor))
@@ -275,11 +279,12 @@ public class LinkService implements AbstractProcessService {
         }
         if (link.getTrafPtrn().getState().isState()) {
             // 패턴값
-            valueHist.setRevisionSpd(link.getTrafPtrn().getSpeed());
+            valueHist.setLinkPatnSpd(link.getTrafPtrn().getSpeed());
         }
         LinkDto upLink = this.linkMap.get(link.getUpLinkId());
         if (upLink != null) {
             // 상류부 링크
+            valueHist.setUpLinkId(upLink.getUpLinkId());
             if (upLink.getTrafFsn().getState().isState() && upLink.getTrafFsn().getState().getCrtDataType() == LinkTrafState.TRAFFIC_CRT_DATA_TYPE.CRT_DATA_NORMAL) {
                 valueHist.setUpLinkSpd(upLink.getTrafFsn().getSpeed());
             }
@@ -290,6 +295,7 @@ public class LinkService implements AbstractProcessService {
         LinkDto dnLink = this.linkMap.get(link.getDnLinkId());
         if (dnLink != null) {
             // 상류부 링크
+            valueHist.setDnLinkId(dnLink.getDnLinkId());
             if (dnLink.getTrafFsn().getState().isState() && dnLink.getTrafFsn().getState().getCrtDataType() == LinkTrafState.TRAFFIC_CRT_DATA_TYPE.CRT_DATA_NORMAL) {
                 valueHist.setDnLinkSpd(dnLink.getTrafFsn().getSpeed());
             }
@@ -300,6 +306,7 @@ public class LinkService implements AbstractProcessService {
         LinkDto grpLink = this.linkMap.get(link.getLink4Id());
         if (grpLink != null) {
             // 레벨4 링크
+            valueHist.setL4LinkId(link.getLink4Id());
             if (grpLink.getTrafFsn().getState().isState() && grpLink.getTrafFsn().getState().getCrtDataType() == LinkTrafState.TRAFFIC_CRT_DATA_TYPE.CRT_DATA_NORMAL) {
                 valueHist.setL4LinkSpd(grpLink.getTrafFsn().getSpeed());
             }

+ 2 - 5
utic-traf-server/src/main/java/com/utic/center/utic/traf/server/service/LinkTrafFusionService.java

@@ -36,9 +36,6 @@ public class LinkTrafFusionService implements AbstractProcessService {
 
     private void initialize() {
         final long start = System.currentTimeMillis();
-        // 0. 링크 소통정보를 초기화 한다.
-        this.linkService.initLinkTraf();
-        log.info("[INF] {}", LogUtils.elapsedLog("링크 소통정보 초기화", System.currentTimeMillis() - start));
 
         // 1. 수집된 소통정보를 객체로 초기화 한다.
         this.collectOPER = Optional.ofNullable(this.collectService.get(LinkTrafCollectSetupService.OPER))
@@ -56,8 +53,8 @@ public class LinkTrafFusionService implements AbstractProcessService {
         this.linkService.getFusionInfo().setColPriCnt(this.collectPRIO.getLists().size());
         this.linkService.getFusionInfo().setColPriEtcCnt(this.collectPRIOETC.getLists().size());
         this.linkService.getFusionInfo().setColMoctCnt(this.collectMOCT.getLists().size());
-        int totalCnt = this.linkService.getLinkMap().size();
-        logInfo("소통정보 초기화", totalCnt, totalCnt, start);
+//        int totalCnt = this.linkService.getLinkMap().size();
+//        logInfo("소통정보 초기화", totalCnt, totalCnt, start);
     }
 
     @ProcessingElapsed(type="TRAFFIC", name="링크 소통정보 퓨전", starting = false)

+ 139 - 3
utic-traf-server/src/main/java/com/utic/center/utic/traf/server/service/LinkTrafPrcsAfterService.java

@@ -2,13 +2,19 @@ package com.utic.center.utic.traf.server.service;
 
 import com.utic.center.common.annotation.ProcessingElapsed;
 import com.utic.center.common.service.AbstractProcessService;
+import com.utic.center.common.utils.LogUtils;
+import com.utic.center.utic.traf.server.config.TraceConfig;
 import com.utic.center.utic.traf.server.dao.repository.utic.UticTrafficRepository;
+import com.utic.center.utic.traf.server.dto.*;
 import lombok.Data;
 import lombok.RequiredArgsConstructor;
 import lombok.ToString;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
 
+import java.util.ArrayList;
+import java.util.Optional;
+
 @Slf4j
 @Data
 @ToString
@@ -16,16 +22,146 @@ import org.springframework.stereotype.Service;
 @Service
 public class LinkTrafPrcsAfterService implements AbstractProcessService {
 
+    private final TraceConfig trace;
+    private final LinkService linkService;
     private final UticTrafficRepository uticRepo;
+    private final LinkTrafCollectService collectService;
+
+    private LinkCollectResultDto collectOPER;
+    private LinkCollectResultDto collectPRIO;
+    private LinkCollectResultDto collectPRIOETC;
+    private LinkCollectResultDto collectMOCT;
 
-    @ProcessingElapsed(type="AFTER", name="가공 후 작업", starting = false)
+    @ProcessingElapsed(type="PRCS", name="교통정보 가공 후 작업", starting = false)
     @Override
     public boolean processing() {
 
-        uticRepo.truncateTrafficLoc(); // 지역 교통정보 테이블 초기화
-        uticRepo.truncateTrafficCenterCache(); // 캐시 테이블 초기화
+        this.collectOPER = Optional.ofNullable(this.collectService.get(LinkTrafCollectSetupService.OPER))
+                .orElseGet(() -> LinkCollectResultDto.builder().clctSystCd(LinkTrafCollectSetupService.OPER).lists(new ArrayList<>()).build());
+        this.collectPRIO = Optional.ofNullable(this.collectService.get(LinkTrafCollectSetupService.PRIO))
+                .orElseGet(() -> LinkCollectResultDto.builder().clctSystCd(LinkTrafCollectSetupService.PRIO).lists(new ArrayList<>()).build());
+        this.collectPRIOETC = Optional.ofNullable(this.collectService.get(LinkTrafCollectSetupService.PRIOETC))
+                .orElseGet(() -> LinkCollectResultDto.builder().clctSystCd(LinkTrafCollectSetupService.PRIOETC).lists(new ArrayList<>()).build());
+        this.collectMOCT = Optional.ofNullable(this.collectService.get(LinkTrafCollectSetupService.MOCT))
+                .orElseGet(() -> LinkCollectResultDto.builder().clctSystCd(LinkTrafCollectSetupService.MOCT).lists(new ArrayList<>()).build());
 
+        debug();
+        this.uticRepo.truncateTrafficLoc();         // 지역 교통정보 테이블 초기화
+        this.uticRepo.truncateTrafficCenterCache(); // 캐시 테이블 초기화
+        initLinkTraf();            // 링크 교통정보 초기화
         return true;
     }
 
+    private void initLinkTraf() {
+        final long start = System.currentTimeMillis();
+        this.linkService.initLinkTraf();
+        log.info("[INF] {}", LogUtils.elapsedLog("교통정보 메모리 초기화", System.currentTimeMillis() - start));
+    }
+    private void debug() {
+        if (this.trace.getDebugLinks().isEmpty()) {
+            return;
+        }
+
+        log.info("[INF] Debug Links: {} EA.", this.trace.getDebugLinks());
+        for (String linkId : this.trace.getDebugLinks()) {
+            LinkDto link = this.linkService.getLink(linkId);
+            if (link == null) {
+                log.info("[INF] Debug Links: Link Not Found: {}", linkId);
+                continue;
+            }
+            printLink("[INF] Link", link);
+            printTraf(link);
+            printCollect(link.getLinkId());
+
+            String dnLinkId = link.getDnLinkId();
+            String upLinkId = link.getUpLinkId();
+            String link4Id = link.getLink4Id();
+            link = this.linkService.getLink(dnLinkId);
+            if (link != null) {
+                printLink("    UpLink", link);
+                printTraf(link);
+                printCollect(link.getLinkId());
+            }
+            link = this.linkService.getLink(upLinkId);
+            if (link != null) {
+                printLink("    DnLink", link);
+                printTraf(link);
+                printCollect(link.getLinkId());
+            }
+            link = this.linkService.getLink(link4Id);
+            if (link != null) {
+                printLink("    Level4", link);
+                printTraf(link);
+                printCollect(link.getLinkId());
+                for (String ll4Id : link.getLinkIds()) {
+                    link = this.linkService.getLink(ll4Id);
+                    if (link != null) {
+                        log.info("    Level4: {}, LinkId: {}, Speed: {}, State: {}, Length: {}, MissValueYn: {}, PtrnSpeed: {}, PsdSpeed: {}",
+                                link4Id, link.getLinkId(), link.getTrafFsn().getSpeed(), link.getTrafFsn().getState().isState(),
+                                link.getLength(), link.getTrafFsn().getState().getMissValueYn(), link.getTrafPtrn().getSpeed(), link.getMissPsd().getSpeed());
+                    }
+                }
+            }
+        }
+    }
+
+    private void printLink(String logHead, LinkDto link) {
+        if (link == null) {
+            return;
+        }
+        log.info("{}: {}, Level: {}, Length: {}, RoadRank: {}, Lanes: {}, MinSpeed: {}, MaxSpeed: {}, upLinkId: {}, dnLinkId: {}, link4Id: {}",
+                logHead,
+                link.getLinkId(), link.getLinkLevel(), link.getLength(), link.getRoadRank()+101,
+                link.getLanes(), link.getMinSpeed(), link.getMaxSpeed(),
+                link.getUpLinkId(), link.getDnLinkId(), link.getLink4Id());
+    }
+
+    private void printTraf(LinkDto link) {
+        LinkTrafVal fsn = link.getTrafFsn();        // 퓨전 소통정보
+        LinkTrafPtrn ptrn = link.getTrafPtrn();     // 현재 주기 패턴값
+        LinkTrafMiss psd = link.getMissPsd();       // PSD 알고리즘 수행 값
+
+        log.info("    Fusion: Speed: {}, State: {}, CrtDataType: {}, MissValueYn: {}, DataResType: {}, CenterId: {}, TrafficGrade: {}, TravelTime: {}, PtrnSpeed: {}",
+                fsn.getSpeed(),
+                fsn.getState().isState(),
+                fsn.getState().getCrtDataType(),
+                fsn.getState().getMissValueYn(),
+                fsn.getState().getDataResType(),
+                fsn.getCenterId(),
+                fsn.getState().getTrafficGrade(),
+                fsn.getTravelTime(),
+                ptrn.getSpeed());
+        log.info("   Pattern: Speed: {}", ptrn.getSpeed());
+        log.info("       Psd: Speed: {}, MissValueYn: {}", ptrn.getSpeed(), psd.getMissValueYn());
+    }
+
+    public void printCollect(String linkId) {
+        this.collectOPER.getLists().stream()
+                .filter(c -> c.getLinkId().equals(linkId))
+                .findFirst()
+                .ifPresent(c -> {
+                    log.info("      OPER: Speed: {}", c.getSpeed());
+                });
+
+        this.collectPRIO.getLists().stream()
+                .filter(c -> c.getLinkId().equals(linkId))
+                .findFirst()
+                .ifPresent(c -> {
+                    log.info("      PRIO: Speed: {}, Priority: {}, MissValueYn: {}, DataResType: {}, CenterId: {}",
+                            c.getSpeed(), c.getCrtPriority(), c.getMissValueYn(), c.getDataResType(), c.getCenterId());
+                });
+        this.collectPRIOETC.getLists().stream()
+                .filter(c -> c.getLinkId().equals(linkId))
+                .findFirst()
+                .ifPresent(c -> {
+                    log.info("   PRIOETC: Speed: {}, Priority: {}, MissValueYn: {}, DataResType: {}, CenterId: {}",
+                            c.getSpeed(), c.getCrtPriority(), c.getMissValueYn(), c.getDataResType(), c.getCenterId());
+                });
+        this.collectMOCT.getLists().stream()
+                .filter(c -> c.getLinkId().equals(linkId))
+                .findFirst()
+                .ifPresent(c -> {
+                    log.info("      MOCT: Speed: {}", c.getSpeed());
+                });
+    }
 }

+ 9 - 6
utic-traf-server/src/main/java/com/utic/center/utic/traf/server/service/LinkTrafProcessService.java → utic-traf-server/src/main/java/com/utic/center/utic/traf/server/service/LinkTrafPrcsInitService.java

@@ -1,5 +1,7 @@
 package com.utic.center.utic.traf.server.service;
 
+import com.utic.center.common.annotation.ProcessingElapsed;
+import com.utic.center.common.service.AbstractProcessService;
 import com.utic.center.common.utils.TimeUtils;
 import com.utic.center.utic.traf.server.dao.repository.utic.UticTrafficRepository;
 import com.utic.center.utic.traf.server.dto.TrafPrcsTimeDto;
@@ -15,8 +17,9 @@ import java.time.LocalDateTime;
 @Getter
 @RequiredArgsConstructor
 @Service
-public class LinkTrafProcessService {
+public class LinkTrafPrcsInitService implements AbstractProcessService {
 
+    private final LinkService linkService;
     private final UticTrafficRepository uticRepo;
 
 //    public boolean initialize() {
@@ -33,7 +36,10 @@ public class LinkTrafProcessService {
 //        }
 //        return false;
 //    }
-    public boolean initialize() {
+
+    @ProcessingElapsed(type="PRCS", name="가공 초기화 작업", starting = false)
+    @Override
+    public boolean processing() {
         LocalDateTime now = LocalDateTime.now();
         int year = now.getYear();
         int month = now.getMonthValue();
@@ -53,10 +59,7 @@ public class LinkTrafProcessService {
                 .incdTime(TimeUtils.addMinutes(prcsTime, -720))
                 .build();
         ApplicationRepository.setTrafPrcsTime(result);
-        return true;
-    }
-
-    public boolean processing() {
+        this.linkService.getFusionInfo().init(prcsTime);
         return true;
     }
 }

+ 2 - 2
utic-traf-server/src/main/java/com/utic/center/utic/traf/server/service/LinkPrepareService.java → utic-traf-server/src/main/java/com/utic/center/utic/traf/server/service/LinkTrafPrcsPrepareService.java

@@ -14,7 +14,7 @@ import org.springframework.stereotype.Service;
 @ToString
 @RequiredArgsConstructor
 @Service
-public class LinkPrepareService implements AbstractProcessService {
+public class LinkTrafPrcsPrepareService implements AbstractProcessService {
 
     private final ApplicationConfig config;
 
@@ -22,7 +22,7 @@ public class LinkPrepareService implements AbstractProcessService {
     private final LinkParamService paramService;
     private final LinkPatternService patternService;
 
-    @ProcessingElapsed(type="PRCS", name="LINK Traffic Process Prepare", starting = false)
+    @ProcessingElapsed(type="PRCS", name="교통정보 가공 전처리", starting = false)
     @Override
     public boolean processing() {
         // 가공정보 완료후 기본정보/파라미터정보/패턴정보를 미리 로딩해 놓는다.

+ 200 - 38
utic-traf-server/src/main/java/com/utic/center/utic/traf/server/service/LinkTrafSaveDwdbService.java

@@ -2,19 +2,22 @@ package com.utic.center.utic.traf.server.service;
 
 import com.utic.center.common.annotation.ProcessingElapsed;
 import com.utic.center.common.service.AbstractProcessService;
+import com.utic.center.common.spring.SpringUtils;
 import com.utic.center.common.utils.LogUtils;
 import com.utic.center.utic.traf.server.dao.mapper.dwdb.DwdbTrafficMapper;
 import com.utic.center.utic.traf.server.dao.mapper.utic.UticTrafficMapper;
+import com.utic.center.utic.traf.server.dao.repository.dwdb.DwdbTrafficRepository;
 import com.utic.center.utic.traf.server.dao.repository.utic.UticTrafficRepository;
-import com.utic.center.utic.traf.server.dto.DbmsJobResult;
+import com.utic.center.utic.traf.server.dto.*;
 import com.utic.center.utic.traf.server.repository.ApplicationRepository;
-import com.utic.center.utic.traf.server.service.worker.LinkTrafSaveDwdbCenterHistWorker;
-import com.utic.center.utic.traf.server.service.worker.LinkTrafSaveDwdbFusionLogWorker;
-import com.utic.center.utic.traf.server.service.worker.LinkTrafSaveDwdbMissingValueHistWorker;
+import com.utic.center.utic.traf.server.service.worker.WorkerUtils;
 import lombok.Data;
 import lombok.RequiredArgsConstructor;
 import lombok.ToString;
 import lombok.extern.slf4j.Slf4j;
+import org.apache.ibatis.session.ExecutorType;
+import org.apache.ibatis.session.SqlSession;
+import org.apache.ibatis.session.SqlSessionFactory;
 import org.springframework.stereotype.Service;
 
 import javax.annotation.PostConstruct;
@@ -36,68 +39,227 @@ public class LinkTrafSaveDwdbService implements AbstractProcessService {
     private final UticTrafficRepository uticRepo;
     private final UticTrafficMapper uticMapper;
     private final DwdbTrafficMapper dwdbMapper;
+    private final DwdbTrafficRepository dwdbRepo;
 
-    private ConcurrentHashMap<String, DbmsJobResult> mapData = new ConcurrentHashMap<>();
+    private SqlSessionFactory sqlSessionFactory;
 
     @PostConstruct
     public void init() {
         // 초기화
-        this.mapData.put(ApplicationRepository.TABLE_TRAFFIC_CENTER_HIST, DbmsJobResult.builder().tableName(ApplicationRepository.TABLE_TRAFFIC_CENTER_HIST).effects(0).elapsedTime(0).build());
-        this.mapData.put(ApplicationRepository.TABLE_LINK_MISSING_VALUE_HIST, DbmsJobResult.builder().tableName(ApplicationRepository.TABLE_LINK_MISSING_VALUE_HIST).effects(0).elapsedTime(0).build());
-        this.mapData.put(ApplicationRepository.TABLE_LINK_FUSION_LOG, DbmsJobResult.builder().tableName(ApplicationRepository.TABLE_LINK_FUSION_LOG).effects(0).elapsedTime(0).build());
+        this.sqlSessionFactory = (SqlSessionFactory) SpringUtils.getBean("dwdbSqlSessionFactory");
     }
 
-    private void initialize() {
-        this.mapData.forEach((jobTable, result) -> {
-            result.setEffects(0);
-            result.setElapsedTime(0);
+    private void insertLinkFusionLog() {
+        LinkTrafFusionInfo fusionInfo = this.linkService.getFusionInfo();
+        log.info("[INF] DWDB 교통정보 처리결과: {}", fusionInfo);
+        this.dwdbRepo.insertLinkFusionLog(fusionInfo);
+    }
+
+
+    private void batchTrafficCenterHist(SqlSessionFactory sqlSessionFactory, DbmsBatchJobResult dbmsJobResult, LinkService linkRepo, String jobTable) {
+        final long start = System.currentTimeMillis();
+        final String mapperName = "insertTrafficCenterHist";
+        final int maxBatchSize = ApplicationRepository.DBMS_BATCH_SIZE;
+        int total, target;
+        int[] linkCounts = new int[4];
+        int jobCnt = 0;
+        total = target = linkCounts[0] = linkCounts[1] = linkCounts[2] = linkCounts[3] = 0;
+
+        try (SqlSession sqlSession = sqlSessionFactory.openSession(ExecutorType.BATCH, false)) {
+            DwdbTrafficMapper mapper = sqlSession.getMapper(DwdbTrafficMapper.class);
+            for (String linkId : dbmsJobResult.getLinkIds()) {
+                LinkDto link = linkRepo.getLinkMap().get(linkId);
+                if (link == null) {
+                    continue;
+                }
+                total++;
+
+                if (!link.getTrafFsn().getState().isState()) {
+                    continue;
+                }
+                if (link.getTrafFsn().getSpeed() == 0) {
+                    // 운영자 입력 및 속도 정보가 0인 것은 제외
+                    continue;
+                }
+                target++;
+
+                LinkTrafCenterDto trafDto = link.getTrafCenter();
+                try {
+                    mapper.insertTrafficCenterHist(trafDto);
+                    linkCounts[trafDto.getLinkLevel()-1]++;
+                    jobCnt++;
+
+                    if (jobCnt % maxBatchSize == 0) {
+                        sqlSession.flushStatements();
+                    }
+                } catch (Exception e) {
+                    log.error("[ERR] batchTrafficCenterHist({}): jobCnt({}), Exception, [{}], {}.",
+                            dbmsJobResult.getJobIndex(), jobCnt, trafDto, e.getMessage());
+                    break;
+                }
+            }
+            sqlSession.flushStatements();
+            sqlSession.commit();
+        } catch (Exception e) {
+            log.error("[ERR] batchTrafficCenterHist({}): Exception, [{}], {}.", dbmsJobResult.getJobIndex(), jobTable, e.getMessage());
+        }
+
+        dbmsJobResult.setTotal(total);
+        dbmsJobResult.setTarget(target);
+        dbmsJobResult.setLink1(linkCounts[0]);
+        dbmsJobResult.setLink2(linkCounts[1]);
+        dbmsJobResult.setLink3(linkCounts[2]);
+        dbmsJobResult.setLink4(linkCounts[3]);
+        dbmsJobResult.setEffects(jobCnt);
+        dbmsJobResult.setElapsedTime(System.currentTimeMillis() - start);
+        log.info("[INS] {} | {}", LogUtils.elapsedLog(mapperName + dbmsJobResult.getJobIndex(), jobCnt, dbmsJobResult.getElapsedTime()), Thread.currentThread().getName());
+    }
+
+    private void insertTrafficCenterHist() {
+        final long start = System.currentTimeMillis();
+        final String jobTable = ApplicationRepository.TABLE_TRAFFIC_CENTER_HIST;
+
+        // 모든 링크 레벨에 대하여 작업처리
+        final ConcurrentHashMap<Integer, DbmsBatchJobResult> mapData = new ConcurrentHashMap<>();
+        final int prcsThreadCount = ApplicationRepository.PRCS_THREAD_COUNT;
+        final int threadPoolSize = WorkerUtils.allocateWorkerLinkJobs(mapData, prcsThreadCount, this.linkService.getLinkLists());
+        final ExecutorService executorService = Executors.newFixedThreadPool(threadPoolSize);
+
+        mapData.forEach((key, dbmsJobResult) -> {
+            executorService.execute(() -> batchTrafficCenterHist(this.sqlSessionFactory, dbmsJobResult, this.linkService, jobTable));
         });
 
-        long count = this.linkService.getLinkMap().values().parallelStream()
-                .filter(link -> link.getLinkLevel() == 1)
-                .filter(link -> link.getTrafFsn().getSpeed() == 0)
-                .count();
-        this.linkService.getFusionInfo().setZeroSpdCnt((int)count);
+        try {
+            executorService.shutdown();
+            if (!executorService.awaitTermination(100, TimeUnit.SECONDS)) {
+                log.warn("[WAN] insertTrafficCenterHist: Timeout while waiting for tasks to finish, [{}].", jobTable);
+                executorService.shutdownNow();
+            }
+        } catch (InterruptedException e) {
+            log.error("[ERR] insertTrafficCenterHist: InterruptedException, [{}], {}.", jobTable, e.getMessage());
+            executorService.shutdownNow();
+        }
+
+        int link1, link2, link3, link4;
+        long elapsedTime = 0;
+        link1 = link2 = link3 = link4 = 0;
+        for (Map.Entry<Integer, DbmsBatchJobResult> entry : mapData.entrySet()) {
+            DbmsBatchJobResult result = entry.getValue();
+            elapsedTime = Math.max(elapsedTime, result.getElapsedTime());
+            link1 += result.getLink1();
+            link2 += result.getLink2();
+            link3 += result.getLink3();
+            link4 += result.getLink4();
+        }
 
-        // 모든 링크에 대해 센터 소통정보 생성
-        this.linkService.makeTrafficCenterDto();
+        final int resultCount = link1 + link2 + link3 + link4;
+        final long totalTime = System.currentTimeMillis() - start;
+
+        log.info("[INF] {}", LogUtils.elapsedLog("레벨1 " + jobTable, link1, elapsedTime));
+        log.info("[INF] {}", LogUtils.elapsedLog("레벨2 " + jobTable, link2, elapsedTime));
+        log.info("[INF] {}", LogUtils.elapsedLog("레벨3 " + jobTable, link3, elapsedTime));
+        log.info("[INF] {}", LogUtils.elapsedLog("레벨4 " + jobTable, link4, elapsedTime));
+        log.info("[INF] {}", LogUtils.elapsedLog(jobTable, resultCount, totalTime));
     }
 
-    @ProcessingElapsed(type="TRAFFIC", name="교통정보 DWDB 저장", starting = false)
-    @Override
-    public boolean processing() {
-        final int THREAD_POOL_SIZE = 3;     // 작업 스레드 개수 설정
-        final int TIMEOUT_SECONDS = 120;    // 최대 대기 시간 설정
+    private void batchLinkMissingValueHist(SqlSessionFactory sqlSessionFactory, DbmsBatchJobResult dbmsJobResult, LinkService linkRepo, String jobTable) {
+        final long start = System.currentTimeMillis();
+        final String mapperName = "insertLinkMissingValueHist";
+        final int maxBatchSize = ApplicationRepository.DBMS_BATCH_SIZE;
+        int total = 0;
+        int jobCnt = 0;
+
+        String exeDate = ApplicationRepository.trafPrcsTime.getPrcsTime().substring(0, 12);
+        try (SqlSession sqlSession = sqlSessionFactory.openSession(ExecutorType.BATCH, false)) {
+            DwdbTrafficMapper mapper = sqlSession.getMapper(DwdbTrafficMapper.class);
+            for (String linkId : dbmsJobResult.getLinkIds()) {
+                LinkDto link = linkRepo.getLinkMap().get(linkId);
+                if (link == null) {
+                    continue;
+                }
+
+                LinkMissingValueHistDto valueHist = linkRepo.getMissingValueHist(link, exeDate);
+                if (valueHist == null) {
+                    continue;
+                }
+                total++;
+
+                try {
+                    mapper.insertLinkMissingValueHist(valueHist);
+                    jobCnt++;
+
+                    if (jobCnt % maxBatchSize == 0) {
+                        sqlSession.flushStatements();
+                    }
+                } catch (Exception e) {
+                    log.error("[ERR] batchLinkMissingValueHist({}): jobCnt({}), Exception, [{}], {}.",
+                            dbmsJobResult.getJobIndex(), jobCnt, valueHist, e.getMessage());
+                    break;
+                }
+            }
+            sqlSession.flushStatements();
+            sqlSession.commit();
+        } catch (Exception e) {
+            log.error("[ERR] batchLinkMissingValueHist({}): Exception, [{}], {}.", dbmsJobResult.getJobIndex(), jobTable, e.getMessage());
+        }
+
+        dbmsJobResult.setTotal(total);
+        dbmsJobResult.setTarget(total);
+        dbmsJobResult.setLink1(jobCnt);
+        dbmsJobResult.setLink2(0);
+        dbmsJobResult.setLink3(0);
+        dbmsJobResult.setLink4(0);
+        dbmsJobResult.setEffects(jobCnt);
+        dbmsJobResult.setElapsedTime(System.currentTimeMillis() - start);
+        log.info("[INS] {} | {}", LogUtils.elapsedLog(mapperName + dbmsJobResult.getJobIndex(), jobCnt, dbmsJobResult.getElapsedTime()), Thread.currentThread().getName());
+    }
 
-        // 데이터 초기화
-        initialize();
+    private void insertLinkMissingValueHist() {
+        final long start = System.currentTimeMillis();
+        final String jobTable = ApplicationRepository.TABLE_LINK_MISSING_VALUE_HIST;
 
-        // 센터 교통정보 캐시 테이블 초기화
-        this.uticRepo.truncateTrafficCenterCache();
+        // 레벨1 링크에 대해서만, 스레드는 4개로 고정
+        final ConcurrentHashMap<Integer, DbmsBatchJobResult> mapData = new ConcurrentHashMap<>();
+        final int prcsThreadCount = 4;
+        final int threadPoolSize = WorkerUtils.allocateWorkerLinkJobs(mapData, prcsThreadCount, this.linkService.getLink1Lists());
+        final ExecutorService executorService = Executors.newFixedThreadPool(threadPoolSize);
 
-        ExecutorService executorService = Executors.newFixedThreadPool(THREAD_POOL_SIZE);
-        executorService.execute(new LinkTrafSaveDwdbCenterHistWorker(this.linkService, this.mapData.get(ApplicationRepository.TABLE_TRAFFIC_CENTER_HIST)));
-        executorService.execute(new LinkTrafSaveDwdbMissingValueHistWorker(this.linkService, this.mapData.get(ApplicationRepository.TABLE_LINK_MISSING_VALUE_HIST)));
-        executorService.execute(new LinkTrafSaveDwdbFusionLogWorker(this.linkService, this.mapData.get(ApplicationRepository.TABLE_LINK_FUSION_LOG), this.dwdbMapper));
+        mapData.forEach((key, dbmsJobResult) -> {
+            executorService.execute(() -> batchLinkMissingValueHist(this.sqlSessionFactory, dbmsJobResult, this.linkService, jobTable));
+        });
 
         try {
             executorService.shutdown();
-            if (!executorService.awaitTermination(TIMEOUT_SECONDS, TimeUnit.SECONDS)) {
+            if (!executorService.awaitTermination(100, TimeUnit.SECONDS)) {
+                log.warn("[WAN] insertLinkMissingValueHist: Timeout while waiting for tasks to finish, [{}].", jobTable);
                 executorService.shutdownNow();
             }
         } catch (InterruptedException e) {
-            log.error("[ERR] LinkTrafCollectService.processing: LinkCollectWorker InterruptedException, {}", e.getMessage());
+            log.error("[ERR] insertLinkMissingValueHist: InterruptedException, [{}], {}.", jobTable, e.getMessage());
             executorService.shutdownNow();
         }
 
-        // 모든 작업이 완료된 후 결과를 출력
+        int resultCount = 0;
         long elapsedTime = 0;
-        for (Map.Entry<String, DbmsJobResult> entry : this.mapData.entrySet()) {
-            DbmsJobResult result = entry.getValue();
+        for (Map.Entry<Integer, DbmsBatchJobResult> entry : mapData.entrySet()) {
+            DbmsBatchJobResult result = entry.getValue();
             elapsedTime = Math.max(elapsedTime, result.getElapsedTime());
-            log.info("[INF] {}", LogUtils.elapsedLog(result.getTableName(), result.getEffects(), result.getElapsedTime()));
+            resultCount += result.getLink1();
         }
 
+        final long totalTime = System.currentTimeMillis() - start;
+
+        log.info("[INF] {}", LogUtils.elapsedLog(jobTable, resultCount, totalTime));
+    }
+
+    @ProcessingElapsed(type="DWDB", name="교통정보 DWDB 저장", starting = false)
+    @Override
+    public boolean processing() {
+
+        insertLinkFusionLog();
+        insertTrafficCenterHist();
+        insertLinkMissingValueHist();
+
         return true;
     }
 

+ 0 - 3
utic-traf-server/src/main/java/com/utic/center/utic/traf/server/service/worker/LinkTrafSaveCacheWorker.java

@@ -45,8 +45,6 @@ public class LinkTrafSaveCacheWorker implements Runnable {
         int threadPoolSize = WorkerUtils.allocateWorkerLinkJobs(mapData, prcsThreadCount, this.linkService.getLinkLists());
         ExecutorService executorService = Executors.newFixedThreadPool(threadPoolSize);
 
-//        log.info("[INF] LinkTrafSaveCenterWorker.run: {}: prcsThreadCount: {}, threadPoolSize: {}.", jobTable, prcsThreadCount, threadPoolSize);
-
         mapData.forEach((key, dbmsJobResult) -> {
             executorService.execute(() -> processBatch(sqlSessionFactory, dbmsJobResult, this.linkService, jobTable));
         });
@@ -142,7 +140,6 @@ public class LinkTrafSaveCacheWorker implements Runnable {
         dbmsJobResult.setEffects(jobCnt);
         dbmsJobResult.setElapsedTime(System.currentTimeMillis() - start);
         log.info("[INS] {} | {}", LogUtils.elapsedLog(mapperName + dbmsJobResult.getJobIndex(), jobCnt, dbmsJobResult.getElapsedTime()), Thread.currentThread().getName());
-//        log.info("[INF] {}, {}", LogUtils.elapsedLog(mapperName + dbmsJobResult.getJobIndex(), jobCnt, stopWatch.getTotalTimeMillis()), dbmsJobResult);
     }
 
 }

+ 17 - 11
utic-traf-server/src/main/java/com/utic/center/utic/traf/server/service/worker/LinkTrafSaveDwdbCenterHistWorker.java

@@ -35,6 +35,10 @@ public class LinkTrafSaveDwdbCenterHistWorker implements Runnable {
 
         ConcurrentHashMap<Integer, DbmsBatchJobResult> mapData = new ConcurrentHashMap<>();
         SqlSessionFactory sqlSessionFactory = (SqlSessionFactory) SpringUtils.getBean("dwdbSqlSessionFactory");
+        if (sqlSessionFactory == null) {
+            log.error("[ERR] LinkTrafSaveDwdbCenterHistWorker.run: SqlSessionFactory is null, [{}].", jobTable);
+            return;
+        }
 
         int prcsThreadCount = ApplicationRepository.PRCS_THREAD_COUNT;
         int threadPoolSize = WorkerUtils.allocateWorkerLinkJobs(mapData, prcsThreadCount, this.linkService.getLinkLists());
@@ -47,10 +51,11 @@ public class LinkTrafSaveDwdbCenterHistWorker implements Runnable {
         try {
             executorService.shutdown();
             if (!executorService.awaitTermination(100, TimeUnit.SECONDS)) {
+                log.warn("[WAN] LinkTrafSaveDwdbCenterHistWorker.run: Timeout while waiting for tasks to finish, [{}].", jobTable);
                 executorService.shutdownNow();
             }
         } catch (InterruptedException e) {
-            log.error("[SAVE...] LinkTrafSaveDwdbCenterHistWorker.run: InterruptedException, [{}], {}.", jobTable, e.getMessage());
+            log.error("[ERR] LinkTrafSaveDwdbCenterHistWorker.run: InterruptedException, [{}], {}.", jobTable, e.getMessage());
             executorService.shutdownNow();
         }
 
@@ -70,11 +75,11 @@ public class LinkTrafSaveDwdbCenterHistWorker implements Runnable {
         this.dbmsJobResult.setEffects(resultCount);
         this.dbmsJobResult.setElapsedTime(System.currentTimeMillis() - start);
 
-        log.info("[SAVE...] (INS) {}", LogUtils.elapsedLog("레벨1 TRAFFIC_CENTER_HIST@DWDB", link1, this.dbmsJobResult.getElapsedTime()));
-        log.info("[SAVE...] (INS) {}", LogUtils.elapsedLog("레벨2 TRAFFIC_CENTER_HIST@DWDB", link2, this.dbmsJobResult.getElapsedTime()));
-        log.info("[SAVE...] (INS) {}", LogUtils.elapsedLog("레벨3 TRAFFIC_CENTER_HIST@DWDB", link3, this.dbmsJobResult.getElapsedTime()));
-        log.info("[SAVE...] (INS) {}", LogUtils.elapsedLog("레벨4 TRAFFIC_CENTER_HIST@DWDB", link4, this.dbmsJobResult.getElapsedTime()));
-        log.info("[SAVE...] ..... {}", LogUtils.elapsedLog("TRAFFIC_CENTER_HIST@DWDB 저장", resultCount, this.dbmsJobResult.getElapsedTime()));
+        log.info("[INF] {}", LogUtils.elapsedLog("레벨1 TRAFFIC_CENTER_HIST@DWDB", link1, this.dbmsJobResult.getElapsedTime()));
+        log.info("[INF] {}", LogUtils.elapsedLog("레벨2 TRAFFIC_CENTER_HIST@DWDB", link2, this.dbmsJobResult.getElapsedTime()));
+        log.info("[INF] {}", LogUtils.elapsedLog("레벨3 TRAFFIC_CENTER_HIST@DWDB", link3, this.dbmsJobResult.getElapsedTime()));
+        log.info("[INF] {}", LogUtils.elapsedLog("레벨4 TRAFFIC_CENTER_HIST@DWDB", link4, this.dbmsJobResult.getElapsedTime()));
+        log.info("[INF] {}", LogUtils.elapsedLog("TRAFFIC_CENTER_HIST@DWDB 저장", resultCount, this.dbmsJobResult.getElapsedTime()));
     }
 
     private void processBatch(SqlSessionFactory sqlSessionFactory, DbmsBatchJobResult dbmsJobResult, LinkService linkRepo, String jobTable) {
@@ -86,13 +91,11 @@ public class LinkTrafSaveDwdbCenterHistWorker implements Runnable {
         int jobCnt = 0;
         total = target = linkCounts[0] = linkCounts[1] = linkCounts[2] = linkCounts[3] = 0;
 
-//        log.info("[SAVE...] LinkTrafSaveDwdbCenterHistWorker.processBatch: [{}], {} EA. {}", dbmsJobResult.getJobIndex(), dbmsJobResult.getEnd() - dbmsJobResult.getStart(), dbmsJobResult);
         try (SqlSession sqlSession = sqlSessionFactory.openSession(ExecutorType.BATCH, false)) {
             DwdbTrafficMapper mapper = sqlSession.getMapper(DwdbTrafficMapper.class);
             for (String linkId : dbmsJobResult.getLinkIds()) {
                 LinkDto link = linkRepo.getLinkMap().get(linkId);
                 if (link == null) {
-                    log.error("[SAVE...] LinkTrafSaveDwdbCenterHistWorker.processBatch: Link is null, [{}].", linkId);
                     continue;
                 }
                 total++;
@@ -100,6 +103,9 @@ public class LinkTrafSaveDwdbCenterHistWorker implements Runnable {
                 if (!link.getTrafFsn().getState().isState()) {
                     continue;
                 }
+                if (!"O".equals(link.getTrafFsn().getState().getMissValueYn()) && link.getTrafFsn().getSpeed() == 0) {
+                    continue;
+                }
                 target++;
 
                 LinkTrafCenterDto trafDto = link.getTrafCenter();
@@ -112,7 +118,7 @@ public class LinkTrafSaveDwdbCenterHistWorker implements Runnable {
                         sqlSession.flushStatements();
                     }
                 } catch (Exception e) {
-                    log.error("[SAVE...] LinkTrafSaveDwdbCenterHistWorker.processBatch({}): jobCnt({}), Exception, [{}], {}.",
+                    log.error("[ERR] LinkTrafSaveDwdbCenterHistWorker.processBatch({}): jobCnt({}), Exception, [{}], {}.",
                             dbmsJobResult.getJobIndex(), jobCnt, trafDto, e.getMessage());
                     break;
                 }
@@ -120,7 +126,7 @@ public class LinkTrafSaveDwdbCenterHistWorker implements Runnable {
             sqlSession.flushStatements();
             sqlSession.commit();
         } catch (Exception e) {
-            log.error("[SAVE...] LinkTrafSaveDwdbCenterHistWorker.processBatch({}): Exception, [{}], {}.", dbmsJobResult.getJobIndex(), jobTable, e.getMessage());
+            log.error("[ERR] LinkTrafSaveDwdbCenterHistWorker.processBatch({}): Exception, [{}], {}.", dbmsJobResult.getJobIndex(), jobTable, e.getMessage());
         }
 
         dbmsJobResult.setTotal(total);
@@ -131,7 +137,7 @@ public class LinkTrafSaveDwdbCenterHistWorker implements Runnable {
         dbmsJobResult.setLink4(linkCounts[3]);
         dbmsJobResult.setEffects(jobCnt);
         dbmsJobResult.setElapsedTime(System.currentTimeMillis() - start);
-        log.info("[SAVE...] (SAV) {}, {}", LogUtils.elapsedLog(mapperName + dbmsJobResult.getJobIndex(), jobCnt, dbmsJobResult.getElapsedTime()), dbmsJobResult);
+        log.info("[INS] {} | {}", LogUtils.elapsedLog(mapperName + dbmsJobResult.getJobIndex(), jobCnt, dbmsJobResult.getElapsedTime()), Thread.currentThread().getName());
     }
 
 }

+ 0 - 40
utic-traf-server/src/main/java/com/utic/center/utic/traf/server/service/worker/LinkTrafSaveDwdbFusionLogWorker.java

@@ -1,40 +0,0 @@
-package com.utic.center.utic.traf.server.service.worker;
-
-import com.utic.center.common.utils.LogUtils;
-import com.utic.center.utic.traf.server.dao.mapper.dwdb.DwdbTrafficMapper;
-import com.utic.center.utic.traf.server.dto.DbmsJobResult;
-import com.utic.center.utic.traf.server.dto.LinkTrafFusionInfo;
-import com.utic.center.utic.traf.server.service.LinkService;
-import lombok.RequiredArgsConstructor;
-import lombok.extern.slf4j.Slf4j;
-
-@Slf4j
-@RequiredArgsConstructor
-public class LinkTrafSaveDwdbFusionLogWorker implements Runnable {
-
-    private final LinkService linkService;
-    private final DbmsJobResult dbmsJobResult;
-    private final DwdbTrafficMapper mapper;
-
-    @Override
-    public void run() {
-        String jobTable = this.dbmsJobResult.getTableName();
-        final long start = System.currentTimeMillis();
-
-        int resultCount = 0;
-        try {
-            Thread.sleep(10);
-            LinkTrafFusionInfo obj = this.linkService.getFusionInfo();
-            resultCount = this.mapper.insertLinkFusionLog(obj);
-        } catch (InterruptedException e) {
-            log.error("[SAVE...] LinkTrafSaveDwdbFusionLogWorker.run: InterruptedException, [{}], {}.", jobTable, e.getMessage());
-        } catch (Exception e) {
-            log.error("[SAVE...] LinkTrafSaveDwdbFusionLogWorker.run: Exception, [{}], {}.", jobTable, e.getMessage());
-        }
-
-        this.dbmsJobResult.setEffects(resultCount);
-        this.dbmsJobResult.setElapsedTime(System.currentTimeMillis() - start);
-        log.info("[SAVE...] (SAV) {}", LogUtils.elapsedLog(jobTable, resultCount, this.dbmsJobResult.getElapsedTime()));
-    }
-
-}

+ 13 - 10
utic-traf-server/src/main/java/com/utic/center/utic/traf/server/service/worker/LinkTrafSaveDwdbMissingValueHistWorker.java

@@ -32,8 +32,13 @@ public class LinkTrafSaveDwdbMissingValueHistWorker implements Runnable {
     public void run() {
         final long start = System.currentTimeMillis();
         String jobTable = this.dbmsJobResult.getTableName();
+
         ConcurrentHashMap<Integer, DbmsBatchJobResult> mapData = new ConcurrentHashMap<>();
         SqlSessionFactory sqlSessionFactory = (SqlSessionFactory) SpringUtils.getBean("dwdbSqlSessionFactory");
+        if (sqlSessionFactory == null) {
+            log.error("[ERR] LinkTrafSaveDwdbMissingValueHistWorker.run: SqlSessionFactory is null, [{}].", jobTable);
+            return;
+        }
 
         // 레벨1 링크에 대해서만, 스레드는 4개로 고정
         int threadPoolSize = WorkerUtils.allocateWorkerLinkJobs(mapData, 4, this.linkService.getLink1Lists());
@@ -46,10 +51,11 @@ public class LinkTrafSaveDwdbMissingValueHistWorker implements Runnable {
         try {
             executorService.shutdown();
             if (!executorService.awaitTermination(100, TimeUnit.SECONDS)) {
+                log.warn("[WAN] LinkTrafSaveDwdbMissingValueHistWorker.run: Timeout while waiting for tasks to finish, [{}].", jobTable);
                 executorService.shutdownNow();
             }
         } catch (InterruptedException e) {
-            log.error("[SAVE...] LinkTrafSaveDwdbMissingValueHistWorker.run: InterruptedException, [{}], {}.", jobTable, e.getMessage());
+            log.error("[ERR] LinkTrafSaveDwdbMissingValueHistWorker.run: InterruptedException, [{}], {}.", jobTable, e.getMessage());
             executorService.shutdownNow();
         }
 
@@ -64,8 +70,8 @@ public class LinkTrafSaveDwdbMissingValueHistWorker implements Runnable {
         this.dbmsJobResult.setEffects(resultCount);
         this.dbmsJobResult.setElapsedTime(System.currentTimeMillis() - start);
 
-        log.info("[SAVE...] (INS) {}", LogUtils.elapsedLog(jobTable, resultCount, elapsedTime));
-        log.info("[SAVE...] ..... {}", LogUtils.elapsedLog("LINK_MISSING_VALUE_HIST@DWDB 저장", resultCount, this.dbmsJobResult.getElapsedTime()));
+        log.info("[INF] {}", LogUtils.elapsedLog(jobTable, resultCount, elapsedTime));
+        log.info("[INF] {}", LogUtils.elapsedLog("LINK_MISSING_VALUE_HIST@DWDB 저장", resultCount, this.dbmsJobResult.getElapsedTime()));
     }
 
     private void processBatch(SqlSessionFactory sqlSessionFactory, DbmsBatchJobResult dbmsJobResult, LinkService linkRepo, String jobTable) {
@@ -75,14 +81,12 @@ public class LinkTrafSaveDwdbMissingValueHistWorker implements Runnable {
         int total = 0;
         int jobCnt = 0;
 
-        String exeDate = ApplicationRepository.trafPrcsTime.getCurrTime().substring(0, 12);
-//        log.info("[SAVE...] LinkTrafSaveDwdbMissingValueHistWorker.processBatch: [{}], {} EA. {}", dbmsJobResult.getJobIndex(), dbmsJobResult.getEnd() - dbmsJobResult.getStart(), dbmsJobResult);
+        String exeDate = ApplicationRepository.trafPrcsTime.getPrcsTime().substring(0, 12);
         try (SqlSession sqlSession = sqlSessionFactory.openSession(ExecutorType.BATCH, false)) {
             DwdbTrafficMapper mapper = sqlSession.getMapper(DwdbTrafficMapper.class);
             for (String linkId : dbmsJobResult.getLinkIds()) {
                 LinkDto link = linkRepo.getLinkMap().get(linkId);
                 if (link == null) {
-                    log.error("[SAVE...] LinkTrafSaveDwdbMissingValueHistWorker.processBatch: Link is null, [{}].", linkId);
                     continue;
                 }
 
@@ -100,7 +104,7 @@ public class LinkTrafSaveDwdbMissingValueHistWorker implements Runnable {
                         sqlSession.flushStatements();
                     }
                 } catch (Exception e) {
-                    log.error("[SAVE...] LinkTrafSaveDwdbMissingValueHistWorker.processBatch({}): jobCnt({}), Exception, [{}], {}.",
+                    log.error("[ERR] LinkTrafSaveDwdbMissingValueHistWorker.processBatch({}): jobCnt({}), Exception, [{}], {}.",
                             dbmsJobResult.getJobIndex(), jobCnt, valueHist, e.getMessage());
                     break;
                 }
@@ -108,7 +112,7 @@ public class LinkTrafSaveDwdbMissingValueHistWorker implements Runnable {
             sqlSession.flushStatements();
             sqlSession.commit();
         } catch (Exception e) {
-            log.error("[SAVE...] LinkTrafSaveDwdbMissingValueHistWorker.processBatch({}): Exception, [{}], {}.", dbmsJobResult.getJobIndex(), jobTable, e.getMessage());
+            log.error("[ERR] LinkTrafSaveDwdbMissingValueHistWorker.processBatch({}): Exception, [{}], {}.", dbmsJobResult.getJobIndex(), jobTable, e.getMessage());
         }
 
         dbmsJobResult.setTotal(total);
@@ -119,8 +123,7 @@ public class LinkTrafSaveDwdbMissingValueHistWorker implements Runnable {
         dbmsJobResult.setLink4(0);
         dbmsJobResult.setEffects(jobCnt);
         dbmsJobResult.setElapsedTime(System.currentTimeMillis() - start);
-        log.info("[SAVE...] (SAV) {}, {}",
-                LogUtils.elapsedLog(mapperName + dbmsJobResult.getJobIndex(), jobCnt, dbmsJobResult.getElapsedTime()), dbmsJobResult);
+        log.info("[INS] {} | {}", LogUtils.elapsedLog(mapperName + dbmsJobResult.getJobIndex(), jobCnt, dbmsJobResult.getElapsedTime()), Thread.currentThread().getName());
     }
 
 }

+ 1 - 1
utic-traf-server/src/main/resources/logback-spring.xml

@@ -5,7 +5,7 @@
     <property name="APP_CLASS_PATH"   value="com.utic.center.utic.traf.server"/>
     <property name="PROJECT_PREFIX"   value="utic-traf"/>
     <property name="PROJECT_NAME"     value="${PROJECT_PREFIX}-server"/>
-    <property name="LOG_CHARSET"      value="EUC-KR" />
+    <property name="LOG_CHARSET"      value="UTF-8" />
     <property name="FILE_LOG_CHARSET" value="EUC-KR" />
 
     <springProperty scope="context" name="LOGGING_PATH" source="logging.path"/>

+ 3 - 3
utic-traf-server/src/main/resources/mybatis/mapper/dwdb/DwdbTrafficMapper.xml

@@ -5,7 +5,7 @@
 
     <insert id="insertTrafficCenterHist" parameterType="com.utic.center.utic.traf.server.dto.LinkTrafCenterDto">
         <![CDATA[
-        INSERT /*+ APPEND PARALLEL(TRAFFIC_CENTER_HIST, 2) */ INTO TRAFFIC_CENTER_HIST NOLOGGING (
+        INSERT /*+ APPEND PARALLEL(TMP_TRAFFIC_CENTER_HIST, 2) */ INTO TMP_TRAFFIC_CENTER_HIST NOLOGGING (
                         regdate        ,
                         linkid         ,
                         missvalueyn    ,
@@ -42,7 +42,7 @@
 
     <insert id="insertLinkFusionLog" parameterType="com.utic.center.utic.traf.server.dto.LinkTrafFusionInfo">
         <![CDATA[
-        INSERT INTO LINK_FUSION_LOG (
+        INSERT INTO TMP_LINK_FUSION_LOG (
             REGDATE,
             PRCSTYPE,
             LINKCNT,
@@ -103,7 +103,7 @@
 
     <insert id="insertLinkMissingValueHist" parameterType="com.utic.center.utic.traf.server.dto.LinkMissingValueHistDto">
         <![CDATA[
-        INSERT /*+ APPEND PARALLEL(LINK_MISSING_VALUE_HIST, 2) */ INTO LINK_MISSING_VALUE_HIST NOLOGGING (
+        INSERT /*+ APPEND PARALLEL(TMP_LINK_MISSING_VALUE_HIST, 2) */ INTO TMP_LINK_MISSING_VALUE_HIST NOLOGGING (
                     linkid          ,
                     exe_date        ,
                     l4_link_speed   ,