Spring-data-jpa n+1問題


Spring-data-jpa的n+1問題

當我們使用JPA提供給我們的find方法時,如果查詢出來的對象關聯着另外10個對象,那么JPA將會發送1+10次查詢(這個對象本身要查詢一次,然后每個關聯對象再查詢一次)

 

解決方案:

1.使用FetchType.EAGER+FetchMode.JOIN 的形式,使得可以自動生成一條帶有LEFT OUTER JOIN 的SQL語句(前提:必須存在主外鍵關聯,否則無效)

 

 

例如:

 

 

此時,即使設置了FetchType.EAGER+FetchMode.JOIN,同樣會存在N+1的問題。

2.使用JPA2.1特性 @NamedEntityGraph注解,這是JPA推出專門優化解決JPA效率的注解。使用方式如下。

先在實體類上做聲明:

 

 

然后再在Repository接口中使用@EntityGraph引用

 

 

 

<注>可以根據不同的問題場景,定義不同的@NamedEntityGraph,切記不要關聯與業務無關的關聯對象,因為會去進行JOIN表,會造成不必要的性能損耗。

 

 

關於在Spring-data-jpa框架下使用Hibernate Predicate時解決N+1問題

解決方案同Spring-data-jpa,區別是,由於在Hibernate 的Predicate中調用的是JpaSpecificationExecutor中的findAll,所以需要在Repository中覆蓋對應的findAll方法,然后添加對應的EntiryGraph的注解,例如

 

 

 

3.使用batchSize(size=10) 進行批處理

 

4.使用懶加載

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM