![](/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.