Преглед изворни кода

aps-生产卡片查询优化

sucheng пре 2 месеци
родитељ
комит
d6a25ddba4

+ 2 - 0
cx-aps/cx-aps-common/src/main/java/com/rongwei/bscommon/sys/dao/ApsProcessOperationProcessEquDao.java

@@ -175,6 +175,8 @@ public interface ApsProcessOperationProcessEquDao extends BaseMapper<ApsProcessO
 
     @Select("SELECT FOUND_ROWS() AS total")
     Integer getTotal();
+
+    Long getCardListCount(@Param("sql") String sql);
 }
 
 

+ 27 - 2
cx-aps/cx-aps-common/src/main/java/com/rongwei/bscommon/sys/service/impl/ApsProcessOperationProcessEquServiceImpl.java

@@ -60,6 +60,7 @@ import java.math.BigDecimal;
 import java.math.RoundingMode;
 import java.net.URLEncoder;
 import java.util.*;
+import java.util.concurrent.CompletableFuture;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.function.IntPredicate;
 import java.util.stream.Collectors;
@@ -3320,7 +3321,7 @@ public class ApsProcessOperationProcessEquServiceImpl extends ServiceImpl<ApsPro
 
             IPage<Map<String, Object>> result = new Page<>();
 
-            queryCard2(result, query);
+            queryCard3(result, query);
 
             return R.ok(result);
         } catch (Exception e) {
@@ -3329,6 +3330,30 @@ public class ApsProcessOperationProcessEquServiceImpl extends ServiceImpl<ApsPro
         }
     }
 
+    //并行查询,使用两次查询
+    private void queryCard3(IPage<Map<String, Object>> result, CriteriaQuery query) {
+        Page<Map<String, Object>> pageInfo = new Page<>(query.getCurrent(), query.getSize());
+        int offset = (query.getCurrent() - 1) * query.getSize();
+        String querySql1 = query.getQuerySql();
+        // 并行查询
+        CompletableFuture<List<Map<String, Object>>> pageFuture = CompletableFuture.supplyAsync(
+                () -> this.baseMapper.getCardListPage(offset, query.getSize(), querySql1));
+
+        String querySql2 = query.getQuerySql().replaceFirst("\\*", "count(1)");
+        CompletableFuture<Long> countFuture = CompletableFuture.supplyAsync(
+                () -> this.baseMapper.getCardListCount(querySql2));
+
+        try {
+            result.setCurrent(query.getCurrent());
+            result.setSize(query.getSize());
+            result.setRecords(pageFuture.get());
+            result.setTotal(countFuture.get());
+        } catch (Exception e) {
+            throw new RuntimeException("查询失败", e);
+        }
+
+    }
+
     private void queryCard2(IPage<Map<String, Object>> result, CriteriaQuery query) {
         //窗口函数 优化查询效率
         query.setQuerySql(query.getQuerySql().replaceFirst("\\*", "*, COUNT(*) OVER() AS total_count"));
@@ -3344,7 +3369,7 @@ public class ApsProcessOperationProcessEquServiceImpl extends ServiceImpl<ApsPro
         result.setRecords(list);
     }
 
-    @Transactional//需要保持事务,还要注意防止数据库连接池不是同一个(仅限mysql使用,大数据量效率不高)
+    @Transactional//需要保持事务,还要注意防止数据库连接池不是同一个连接(仅限mysql使用,大数据量效率不高)
     public void queryCard(IPage<Map<String, Object>> result, CriteriaQuery query) {
         //mysql专属优化,全表扫描,但只扫描一次
         query.setQuerySql(query.getQuerySql().replaceFirst("\\*", "SQL_CALC_FOUND_ROWS *"));

+ 3 - 0
cx-aps/cx-aps-common/src/main/resources/mybatis/ApsProcessOperationProcessEquDao.xml

@@ -1002,4 +1002,7 @@
         ${sql}
         LIMIT #{size} OFFSET #{offset}
     </select>
+    <select id="getCardListCount" resultType="java.lang.Long">
+        ${sql}
+    </select>
 </mapper>