이호영 이호영 2024-07-29
주소록 등록 : 쓰레드 4개 추가 - 배치 사이즈 60000개
@97cbc423a9e2b114d448137f0ac4a5e3aeba9486
src/main/java/itn/let/mjo/addr/service/impl/AddrServiceImpl.java
--- src/main/java/itn/let/mjo/addr/service/impl/AddrServiceImpl.java
+++ src/main/java/itn/let/mjo/addr/service/impl/AddrServiceImpl.java
@@ -6,6 +6,9 @@
 import java.util.Date;
 import java.util.List;
 import java.util.Locale;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.AtomicInteger;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
@@ -63,6 +66,7 @@
 //    private static final int MAX_ADDR_CNT = 500000;
     //임시 500만개
     private static final int MAX_ADDR_CNT = 5000000;
+    private static final int THREAD_COUNT = 4; // 적절한 스레드 수 설정
 	
 	
 	public List<AddrVO> selectAddrList(AddrVO addrVO) throws Exception {
@@ -474,7 +478,8 @@
 	        if(addrListVO.size() > 0) {
 	    		// 등록 
 	            // Batch insert
-	                batchInsertAddrList(addrListVO);
+//	                batchInsertAddrList(addrListVO);
+	                batchInsertAddrListAsync(addrListVO);
 					
 	//    		addrDAO.insertAddrList(addrListVO);
 	        	
@@ -511,27 +516,33 @@
 				, LocalDateTime.now());
 	}
 
-    private void batchInsertAddrList(List<AddrVO> addrListVO) throws Exception {
-    	
+
+    private void batchInsertAddrListAsync(List<AddrVO> addrListVO) throws InterruptedException {
         int totalSize = addrListVO.size();
         int batchCount = (totalSize + BATCH_SIZE - 1) / BATCH_SIZE;
-        long startTime, endTime;
-        double executionTime;
+        ExecutorService executor = Executors.newFixedThreadPool(THREAD_COUNT);
 
         for (int i = 0; i < batchCount; i++) {
-            int startIndex = i * BATCH_SIZE;
-            int endIndex = Math.min(startIndex + BATCH_SIZE, totalSize);
-            List<AddrVO> batchList = addrListVO.subList(startIndex, endIndex);
+            final int startIndex = i * BATCH_SIZE;
+            final int endIndex = Math.min(startIndex + BATCH_SIZE, totalSize);
+            final List<AddrVO> batchList = addrListVO.subList(startIndex, endIndex);
 
-            startTime = System.currentTimeMillis();
-            addrDAO.insertAddrList(batchList);
-            endTime = System.currentTimeMillis();
-
-            executionTime = (endTime - startTime) / 1000.0;
-            System.out.println("Batch " + (i + 1) + "/" + batchCount + " Execution time: " + executionTime + " seconds");
+            executor.submit(() -> {
+                try {
+                    long startTime = System.currentTimeMillis();
+                    addrDAO.insertAddrList(batchList);
+                    long endTime = System.currentTimeMillis();
+                    double executionTime = (endTime - startTime) / 1000.0;
+                    System.out.println("Batch " + (startIndex / BATCH_SIZE + 1) + "/" + batchCount + " Execution time: " + executionTime + " seconds");
+                } catch (Exception e) {
+                    e.printStackTrace();
+                }
+            });
         }
-		
-	}
+
+        executor.shutdown();
+        executor.awaitTermination(1, TimeUnit.HOURS);
+    }
 
 	public static boolean isValidPhoneNumber(String phoneNo) {
         if (phoneNo == null || phoneNo.isEmpty()) {
src/main/webapp/WEB-INF/jsp/web/addr/include/addrListforExcel.jsp
--- src/main/webapp/WEB-INF/jsp/web/addr/include/addrListforExcel.jsp
+++ src/main/webapp/WEB-INF/jsp/web/addr/include/addrListforExcel.jsp
@@ -535,6 +535,7 @@
 
     function excelFileChange(file){
 
+		$('.loading_layer').addClass('active');	
 //         var file = event.target.files[0];
         if (file) {
             var reader = new FileReader();
@@ -547,6 +548,10 @@
             };
             reader.readAsArrayBuffer(file);
         }
+
+		//로딩창 hide
+		$('.loading_layer').removeClass('active');
+        
     }
 
     // 엑셀 데이터 처리 함수
Add a comment
List