首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Spring数据查询执行优化: JpaRepository中Hibernate @Query方法的并行执行

Spring数据查询执行优化: JpaRepository中Hibernate @Query方法的并行执行
EN

Stack Overflow用户
提问于 2016-08-14 15:21:47
回答 2查看 7.3K关注 0票数 8

我有一个仪表板视图,它需要来自数据库中所有表的小数据集。我优化了数据库查询(例如,删除子查询)。现在大约有20个查询被一个接一个地执行,这些查询从数据库中获取不同的数据集。大多数HQL查询都包含GROUP BYJOIN子句。使用Spring REST接口,结果被返回到前端。

如何优化自定义查询的执行?我最初的想法是并行运行数据库查询。但是我如何做到这一点呢?在做了一些研究之后,我发现了注释@Async,它使得并行运行方法成为可能。但是,这是否适用于Hibernate方法?在JpaRepository中,是否总是为每个用@Query注释的方法创建一个新的数据库会话?毕竟,运行数据库查询对整体执行时间有影响吗?

另一种并行运行数据库调用的方法是将Dashboard调用拆分为几个单独的Ajax调用(每个关注点都有自己的Ajax调用)。我不想这样做,因为每次打开仪表板(或者更改日期范围)时,都会进行另外20个Ajax调用来获取新数据。同样的问题仍然存在:并行运行SQL查询是否会影响数据库的执行时间?

我目前还没有在数据库中添加额外的索引。这将是下一件事,我肯定会做的。然而,我感兴趣的是并行运行查询的性能影响,以及如何使用Spring以编程方式实现这一点。

我的项目最初是由jHipster (Spring Boot、MariaDB、AngularJS等)生成的。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-08-18 10:30:21

首先,并行运行这些SQL不会影响数据库,它只会使页面加载更快,所以设计应该关注这一点。

假设您已经确保不能组合这20个SQL,因为这些数据是不相关的(没有连接、视图等),所以我在这里发布这个答案。

我建议不要使用@Async,原因有两个。

原因1-当你想要触发一堆任务并忘记时,或者当你知道所有任务何时都会完成时,异步任务是很棒的。因此,您需要“等待”所有异步任务完成。你要等多久?直到最慢的查询完成?

检查异步的示例代码(来自指南@ spring.io --https://spring.io/guides/gs/async-method/)

代码语言:javascript
复制
// Wait until they are all done
while (!(page1.isDone() && page2.isDone() && page3.isDone())) {
     Thread.sleep(10); //10-millisecond pause between each check
}

您的服务组件是否/应该等待20个异步DAO查询?

原因2-请记住,异步只是将任务派生为线程。由于您将使用JPA,请记住实体管理器不是线程安全的。DAO类将传播事务。以下是可能突然出现的问题的示例- http://alexgaddie.blogspot.com/2011/04/spring-3-async-with-hibernate-and.html

IMHO,最好使用多个Ajax调用,因为这将使您的组件具有内聚性。是的,您将有20个端点,但是它们将具有更简单的DAO、更简单的SQL、更容易的单元可测试性,并且返回的数据结构将更容易由AngularJS小部件处理/解析。当UI触发所有20个Ajax调用时,仪表板将在小部件准备就绪时加载单个小部件,而不是同时加载所有小部件。这将帮助您通过优化仪表板的加载速度较慢的部分(可能是缓存、索引等)来扩展您的设计。

将DAO调用捆绑在一起只会使数据结构变得复杂,并使单元测试更加困难。

票数 7
EN

Stack Overflow用户

发布于 2016-08-24 03:18:37

通常情况下,并行执行查询会快得多。如果您正在使用Spring data并且没有配置任何特定的东西,那么您的JPA提供者(Hibernate)将创建一个连接池来存储到您的数据库的连接。我认为,默认情况下,Hibernate拥有10个连接,通过这样做,它准备并行执行10个查询。并行运行查询的速度取决于数据库和表/查询的结构。我认为在这里使用@Async不是最好的做法。定义20个REST端点来提供特定查询的结果是一种更好的方法。通过这样做,您可以简单地为每个查询创建实体、存储库和RestEndpoint类。通过这样做,每个查询都是独立的,代码也更简单。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38940047

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档