如何使用spring boot并行执行SQL查询?

问题描述 投票:0回答:2

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

对于例如在这里,我做了3个不同的调用,为图表获得3个不同的值:

Controller Class and Repository class

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

在JDBC中有一个批处理的概念,我们可以使用addBatch和excuteBatch来做我想要的,但是我无法理解我是否可以使用Spring批处理实现相同的目标。

java spring spring-boot spring-data-jpa spring-batch
2个回答
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


0
投票

听起来你想要将它们作为异步查询来实现。我相信,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实例,但我不建议)

© www.soinside.com 2019 - 2024. All rights reserved.