一般我们写Java程序,都是同步去执行的。但是当遇到一个方法中有多个特别耗时的SQL查询,这时候我们就得等一个个sql慢慢执行完,比如一个SQL查询2秒,3个就是6秒,这个就不是我们想要的呢。那怎么解决呢?第一优化你的SQL;第二优化你的程序。

本篇文章主要介绍的是优化你的程序,我们可以将同步的SQL查询改为异步的SQL查询。具体如何操作,我就直接贴代码了:

text
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53
  CompletableFuture<List> firstFuture = CompletableFuture.supplyAsync(() -> {
      try {
         Map<String, Object> paramsMap = new HashMap<>();
         //TODO 设置参数 因是异步执行 要保持参数一直
         paramsMap.put("XX", "XX");
         ...
         ...


        //数据库查询
         return xxxMapper.selectXXXByParams(paramsMap);
      } catch (Exception e) {
         e.printStackTrace();
      }
      return null;
   });


  CompletableFuture<List> secondFuture = CompletableFuture.supplyAsync(() -> {
      try {
         Map<String, Object> paramsMap = new HashMap<>();
         //TODO 设置参数 因是异步执行 要保持参数一直
         paramsMap.put("XX", "XX");
         ...
         ...


        //数据库查询
         return xxxMapper.selectXXXByParams(paramsMap);
      } catch (Exception e) {
         e.printStackTrace();
      }
      return null;
   });
   
   //有几个查询写几个 
   ...
   ...
   
   //接收异步查询的结果
   CompletableFuture.allOf(firstFuture, secondFuture, ...).join();
   List<Object> firstResult = firstFuture.get();
   List<Object> secondResult = secondFuture.get();
   ...
   ...




上面代码就是异步查询数据库的核心代码,因为是异步执行,要注意参数的一致性(原子性)。


 改为异步你会发现多个长耗时的SQL异步去执行,大大减少了程序等待的时间,提升了响应。

上面只是个人理解,如有不正或者更好的方法,请麻烦通知我修正,谢谢!

原文地址:https://blog.csdn.net/boyin333/article/details/90479531?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522168904449916800185828444%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id=168904449916800185828444&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~first_rank_ecpm_v1~rank_v31_ecpm-5-90479531-null-null.142^v88^control_2,239^v2^insert_chatgpt&utm_term=java%E4%BC%98%E5%8C%96