【问题标题】:How to execute SQL query in parallel using spring boot?如何使用spring boot并行执行SQL查询?
【发布时间】:2018-06-02 13:39:28
【问题描述】:

我在一个页面中有多个图表,这些图表将使用数据库中的值进行更新。 我在初始化图表时进行 ajax 调用,现在请求到达控制器类。 从控制器类我使用存储库类对象多次调用数据库。 如何通过多个查询向数据库发出单个请求并获得响应数组。

例如在这里,我进行了 3 次不同的调用以获得图表的 3 种不同值:

Controller Class and Repository class

如何将这些请求合并为一个。

在 JDBC 中有一个批处理的概念,我们可以使用 addBatch 和 excuteBatch 来做我想做的事情,但我不明白是否可以使用 Spring 批处理来实现。

【问题讨论】:

    标签: java spring spring-boot spring-data-jpa spring-batch


    【解决方案1】:

    Statement.addBatch 不应该用于SELECT,而是用于批处理INSERTs 和UPDATEs

    您需要的是一个带有 UNION 的自定义查询,以便在一个 sql 中获取您需要的所有数据。

          SELECT COUNT(n.lastUpdatedOn)
          FROM TableEntity n 
          WHERE n.lastUpdatedOn BETWEEN :start1 AND :end1 
          UNION 
          SELECT COUNT(n.lastUpdatedOn)
          FROM TableEntity n 
          WHERE n.lastUpdatedOn BETWEEN :start2 AND :end2 
          UNION 
          SELECT COUNT(n.lastUpdatedOn)
          FROM TableEntity n 
          WHERE n.lastUpdatedOn BETWEEN :start3 AND :end3
    

    还有你的存储库代码。

    @Query("SELECT COUNT(n.lastUpdatedOn) FROM TableEntity n WHERE n.lastUpdatedOn BETWEEN :start1 AND :end1 UNION SELECT COUNT(n.lastUpdatedOn) FROM TableEntity n WHERE n.lastUpdatedOn BETWEEN :start2 AND :end2 UNION SELECT COUNT(n.lastUpdatedOn) FROM TableEntity n WHERE n.lastUpdatedOn BETWEEN :start3 AND :end3")
    List<Long> countModifiedTimeStamp(@Param("start1") Timestamp start1, @Param("end1") Timestamp end1, @Param("start2") Timestamp start2, @Param("end2") Timestamp end2, @Param("start3") Timestamp start3, @Param("end3") Timestamp end3);
    

    当你打电话时

    List<Long> counts = this.repo.countModifiedTimeStamp(todayStartDay, today, last7days, today, longBack, last7days);
    

    在返回的列表中,today 在第一个元素中,last7days 在第二个元素中,longBack 在第三个元素中。

    【讨论】:

      【解决方案2】:

      听起来您想将这些实现为异步查询。 我相信这在 Spring Data JPA 文档中有介绍。您可以在当前版本中使用这些方法格式中的任何一种:

      @Async
      Future<User> findByFirstname(String firstname);               
      
      @Async
      CompletableFuture<User> findOneByFirstname(String firstname); 
      
      @Async
      ListenableFuture<User> findOneByLastname(String lastname);
      

      https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#repositories.query-async

      (您也可以为每个实例分离出单独的 Thread 实例,但我不建议这样做)

      【讨论】:

        猜你喜欢
        • 2019-07-18
        • 1970-01-01
        • 2019-01-12
        • 1970-01-01
        • 2017-10-15
        • 2019-09-02
        • 1970-01-01
        • 1970-01-01
        • 2017-02-15
        相关资源
        最近更新 更多