Эх сурвалжийг харах

添加线程锁,优化数据查询逻辑。

DESKTOP-6LTVLN7\Liumouren 2 сар өмнө
parent
commit
f086afc26f

+ 58 - 23
src/main/java/com/skyversation/poiaddr/service/AreaService.java

@@ -26,7 +26,9 @@ import javax.annotation.PostConstruct;
 import javax.annotation.Resource;
 import java.io.*;
 import java.util.ArrayList;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 
 @Service
 public class AreaService {
@@ -37,6 +39,9 @@ public class AreaService {
     @Autowired
     private AmapAddressV3Service amapAddressV3Service;
 
+//  暂存数据库中的所有数据
+    private Map<String, AmapAddressV3> allAddressData = new HashMap<>();
+
     private static AreaService instance;
 
     public static AreaService getInstance() {
@@ -74,6 +79,23 @@ public class AreaService {
         Constant.setArea(area);
         System.out.println("<<<<<<<<------根据配置文件为AREA赋值:" + Constant.getArea());
         System.out.println("<<<<<<<<------当前AMAP_CITY_CODE:" + Constant.getAMAP_CITY_CODE());
+//      TODO 数据库连通性测试
+        try {
+            long startTime = System.currentTimeMillis();
+            System.out.println("<<<<<<<<------开始数据库连通性测试");
+            List<AmapAddressV3> amapAddressV3List = amapAddressV3Service.getAllData();
+            long endTime = System.currentTimeMillis();
+            System.out.println(">>>>>>>>------数据库连通性测试完成!用时" + (endTime - startTime) / 1000 + "秒!当前数据库数据条数:" + amapAddressV3List.size());
+            System.out.println("<<<<<<<<------开始缓存数据库数据");
+            for (AmapAddressV3 amapAddressV3 : amapAddressV3List) {
+                allAddressData.put(amapAddressV3.getAddress(), amapAddressV3);
+            }
+            amapAddressV3List.clear();
+            System.out.println(">>>>>>>>------缓存数据库数据完成!allAddressData.size()="+allAddressData.size());
+        } catch (Exception e) {
+            System.err.println(">>>>>>>>------数据库连通性测试结果:" + e);
+        }
+
 //      TODO 网络连通性测试,可以请求一下测试的市中心地址
         try {
             System.out.println("电脑最大线程数:" + Runtime.getRuntime().availableProcessors());
@@ -87,19 +109,6 @@ public class AreaService {
         } catch (Exception e) {
             System.err.println(">>>>>>>>------网络连通性测试结果:" + e);
         }
-//      TODO 数据库连通性测试
-        try {
-            long startTime = System.currentTimeMillis();
-            System.out.println("<<<<<<<<------开始数据库连通性测试");
-            Long amapAddressV3List = amapAddressV3Service.countAllUsersNative();
-            long endTime = System.currentTimeMillis();
-            System.out.println(">>>>>>>>------数据库连通性测试完成!用时" + (endTime - startTime) / 1000 + "秒!当前数据库数据条数:" + amapAddressV3List);
-//            System.out.println("<<<<<<<<------开始执行任务!!!");
-//            yyskAddressStandardizationService.searchLoadFileData("D:\\1.项目\\5. 松江项目\\4. 地名地址\\地名地址库治理数据\\原始数据\\",
-//                    0, 10000, 1);
-        } catch (Exception e) {
-            System.err.println(">>>>>>>>------数据库连通性测试结果:" + e);
-        }
     }
 
     public void initPolygons() {
@@ -148,27 +157,53 @@ public class AreaService {
         System.out.println("<<<<<<<<------run geo data complete------>>>>>>>>>");
     }
 
-    public void saveAmapAddressV3(List<AmapAddressV3> amapAddressV3List){
-        amapAddressV3Service.saveAmapAddressV3(amapAddressV3List);
+    public void saveAmapAddressV3(List<AmapAddressV3> amapAddressV3List) {
+        List<AmapAddressV3> amapAddressV3SaveList = new ArrayList<>();
+        for (AmapAddressV3 amapAddressV3 : amapAddressV3List) {
+            if (!allAddressData.containsKey(amapAddressV3.getAddress())) {
+                allAddressData.put(amapAddressV3.getAddress(), amapAddressV3);
+                amapAddressV3SaveList.add(amapAddressV3);
+            }
+        }
+        amapAddressV3List.clear();
+        if (amapAddressV3SaveList.size() > 0) {
+            amapAddressV3Service.saveAmapAddressV3(amapAddressV3List);
+            amapAddressV3List.clear();
+        }
     }
 
-    public List<AmapAddressV3> getAddressPoisByAddr(String addr){
+    public List<AmapAddressV3> getAddressPoisByAddr(String addr) {
+        List<AmapAddressV3> resultData = new ArrayList<>();
         String[] strs = AddressMatcher.matchProvinceAndCity(addr);
-        if(strs != null){
-            for(String str : strs){
-                if(StringUtils.hasText(str)){
+        if (strs != null) {
+            for (String str : strs) {
+                if (StringUtils.hasText(str)) {
                     addr = addr.replace(str, "");
                 }
             }
         }
 
-        if(addr.contains("号")){
+        if (addr.contains("号")) {
             addr = addr.substring(0, addr.lastIndexOf("号") + 1);
-        } else if(addr.contains("弄")){
+        } else if (addr.contains("弄")) {
             addr = addr.substring(0, addr.lastIndexOf("弄") + 1);
         }
-        System.out.println("<<<<<<<----- 开始数据库查询,数据查询地址为:" + addr);
-        return amapAddressV3Service.getAddressPoisByAddr(addr);
+        if (allAddressData.containsKey(addr)) {
+            resultData.add(allAddressData.get(addr));
+            return resultData;
+        } else {
+            int sumSize = 20;
+            for (String address : allAddressData.keySet()) {
+                if (address.contains(addr) && sumSize > 0) {
+                    sumSize--;
+                    resultData.add(allAddressData.get(address));
+                }
+            }
+        }
+        return resultData;
+//        TODO 使用缓存替换数据库查询
+//        System.out.println("<<<<<<<----- 开始数据库查询,数据查询地址为:" + addr);
+//        return amapAddressV3Service.getAddressPoisByAddr(addr);
     }
 
     public GeoJsonBean isInadPolygon(double lon, double lat) {

+ 4 - 0
src/main/java/com/skyversation/poiaddr/service/impl/AmapAddressV3Service.java

@@ -25,4 +25,8 @@ public class AmapAddressV3Service {
         return amapAddressV3Repository.getAddressPoisByAddr(addr);
     }
 
+    public List<AmapAddressV3> getAllData(){
+        return amapAddressV3Repository.findAll();
+    }
+
 }

+ 11 - 5
src/main/java/com/skyversation/poiaddr/service/impl/YyskAddressStandardizationServiceImpl.java

@@ -311,21 +311,27 @@ public class YyskAddressStandardizationServiceImpl {
     public void searchLoadFileData(String fileRootPath, Integer startFileIndex, Integer endFileIndex, Integer sort) {
         // 任务总数
         int totalTasks = Math.abs(endFileIndex - startFileIndex);
-        // 最大线程数
-        int maxThreads = Runtime.getRuntime().availableProcessors();
         // 创建一个最大线程数一半的线程池
-        ExecutorService executorService = Executors.newFixedThreadPool(maxThreads / 2);
+        ExecutorService executorService = Executors.newFixedThreadPool(6);
+        List<Future<?>> futures = new ArrayList<>();
         // 提交任务到线程池
         for (int i = 0; i < totalTasks; i++) {
             final int taskId = sort * (i + 1) + startFileIndex;
-            executorService.submit(() -> {
+            futures.add(executorService.submit(() -> {
                 // 任务执行
                 System.out.println("<<<<<<------Executing task: " + taskId + " on thread: " + Thread.currentThread().getName() + "------>>>>>>>>");
                 startMutilExecutor(taskId, fileRootPath + "datas\\yysk_dmdz_address_standardization_200000_" + taskId + ".xlsx",
                         fileRootPath + "output\\yysk_dmdz_address_standardization_200000_result_" + taskId + ".xlsx");
-            });
+            }));
         }
 
+        for (Future<?> future : futures) {
+            try {
+                future.get();
+            } catch (InterruptedException | ExecutionException e) {
+                System.err.println("线程异常:" + e);
+            }
+        }
         // 关闭线程池
         executorService.shutdown();
         System.out.println("<<<<<--- 任务完成!!!----->>>>>>>");