gpt4 book ai didi

java - DB 查询很快,但 JPARepository 获取很慢

转载 作者:行者123 更新时间:2023-11-30 02:36:53 25 4
gpt4 key购买 nike

我在数据库中有以下表格:

父级祖 parent Parent - PersonOneToMany 关系(PersonparentId)GrandParent - ParentManyToMany 关系(grandparent_parent 表)

我在 PersonRepository 中创建,它扩展了 JPARepository :

@Query("SELECT person.uuid FROM Person person JOIN person.parent parent JOIN parent.grandparents grandparent WHERE grandparent.uuid = ?1")
Set<String> findByGrandParentId(final String parentId);

用于获取给定GrandParent下的Person的所有ID。创建此 SQL:

SELECT
person0_.uuid as col_0_0_
FROM
person person0_
INNER JOIN
parent parent1_
on person0_.parentid=parent1_.uuid
INNER JOIN
grandparent_parent grandaparent_parent2_
on parent1_.uuid=grandaparent_parent2_.parentid
INNER JOIN
grandparent parent3_
on grandaparent_parent2_.grandparentid=parent3_.uuid
WHERE
parent3_.uuid='13906f55-441c-45bd-bef6-8beefa4119c4'

我记录了存储库需要多少时间来获取数据,并且花费(平均)~400ms来获取~400记录。然后我在数据库上执行相同的 SQL 查询,每次查询花费的时间不超过 50 毫秒

我知道这个生成的查询没有优化,因为我们只能连接两个表GRANDPARENT_PARENTPERSON,但这不是这里的问题,因为执行了这样的查询也低于50ms

为什么通过存储库获取和在数据库中获取之间存在如此大的差异?可以解决这个问题吗?

最佳答案

多种可能性:

<强>1。生成的查询

生成的查询对我来说看起来相当不错。它与 @Query 注释中的查询完全相同。

<强>2。 SQL 结果到 Java 对象转换

我不知道您的表有多大,但是:将 SQL 结果转换为 Java 对象需要一些时间。对于小型表,这可能会使查询时间增加 0-5%。

<强>3。延迟加载

您没有显示实体的代码。如果您有 @OneToMany@ManyToMany 关系,JPA 将默认使用延迟加载。这确实会大大减慢一切速度。

<强>4。延迟

如果您在 SQL DB 所在的同一台计算机上执行 SQL 查询,但您的 Java 应用程序通过网络与 SQL DB 进行通信,则也可能导致查询速度慢得多。

(5.错误的数据库类型。看起来你构建了一个对象图。也许看看 Neo4j ;-))

关于java - DB 查询很快,但 JPARepository 获取很慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42810067/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com