![](/img/trans.png)
[英]JpaRepository findBy query (SELECT) is updating records in the DB
[英]Query on DB is fast, but fetching by JPARepository is slow
我在数据库中有以下表格:
Person
, Parent
, GrandParent
Parent - Person
是OneToMany
关系( Person
有parentId
) GrandParent - Parent
是ManyToMany
关系( grandparent_parent
表)
我在扩展JPARepository
PersonRepository
中创建:
@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分的记录。 然后我在 DB 上执行相同的 SQL 查询,每次查询花费的时间不超过50ms 。
我知道这个生成的查询没有优化,因为我们只能连接两个表GRANDPARENT_PARENT
和PERSON
,但这不是这里的问题,因为这样的查询也在50ms以下执行。
为什么我在通过存储库获取和在数据库中获取之间有如此大的差异? 有没有可能解决这个问题?
多种可能性:
1. 生成的查询
生成的查询对我来说看起来很不错。 它与@Query
注释中的查询@Query
。
2. SQL Result 到 Java Object 的转换
我不知道您的表有多大,但是:将 SQL 结果转换为 Java 对象需要一些时间。 对于小表,这可能会增加 0-5% 的查询时间。
3. 懒加载
您没有显示实体的代码。 如果您有@OneToMany
或@ManyToMany
关系,JPA 将默认使用延迟加载。 这真的可以让一切都减慢幅度。
4. 延迟
如果您在 SQL DB 所在的同一台机器上执行 SQL 查询,但您的 Java 应用程序通过网络与 SQL DB 通信,它也会导致查询速度慢得多。
(5. 错误的数据库类型。好像你构建了一个对象图。也许看看 Neo4j ;-)
)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.