사용자 도구

사이트 도구


java:hibernate:performance

차이

문서의 선택한 두 판 사이의 차이를 보여줍니다.

차이 보기로 링크

양쪽 이전 판 이전 판
다음 판
이전 판
다음 판 양쪽 다음 판
java:hibernate:performance [2022/01/14 15:45]
kwon37xi
java:hibernate:performance [2022/05/27 16:34]
kwon37xi [Join Fetch]
줄 11: 줄 11:
   * [[java:quickperf|QuickPerf]] 로 lazy loading 발생여부 확인 가능(실제로는 쿼리가 날라간 갯수를 테스트 코드로 검증가능)   * [[java:quickperf|QuickPerf]] 로 lazy loading 발생여부 확인 가능(실제로는 쿼리가 날라간 갯수를 테스트 코드로 검증가능)
  
-==== Join Fetch ==== +===== N+1 ===== 
-  * JPQL 에서 ''join fetch''를 통해서 (inner join등 명시) N + 1 대신에 미리 join 문으로 객체를 로딩할 수 있다.+  * [[https://github.com/adgadev/jplusone|adgadev/jplusone: Tool for automatic detection and asserting "N+1 SELECT problem" occurences in JPA based Spring Boot Java applications and finding origin of JPA issued SQL statements in general]] 
 +  * https://stackoverflow.com/questions/97197/what-is-the-n1-selects-problem-in-orm-object-relational-mapping/39696775?stw=2#39696775 
 +  * [[https://github.com/vladmihalcea/db-util/tree/master/scripts/ramdisk/windows|vladmihalcea/db-util: If you are using JPA and Hibernate, this tool can auto-detect N+1 query issues during testing.]]
  
 +===== Join Fetch =====
 +  * JPQL 에서 ''join fetch''를 통해서 (inner join등 명시) N + 1 대신에 미리 join 문으로 객체를 로딩할 수 있다.
 +  * 하지만 **1:N 관계에서 1측이 N 만큼 반복 조회되는 문제가 있다. 실제 엔티티 객체가 여러개 생성된다.**
 +  * 따라서 ''BatchSize''를 지정하고, join fetch 보다는 ''Hibernate.initialize(lazy로딩객체)'' 형태를 사용하는게 더 나을 수 있다. 이 경우에는 1+1 번 조회가 나가는 편이다(batch size에 따라 달라짐. batch size 단위로 조회 반복).
 ===== @org.hibernate.annotations.BatchSize ===== ===== @org.hibernate.annotations.BatchSize =====
 ''batch-size'' 설정은 **OneToMany** 등의 관계에서 Many쪽 Lazy Proxy 객체를 로딩할때, 한번에 로딩할 갯수를 지정한다. ''batch-size'' 설정은 **OneToMany** 등의 관계에서 Many쪽 Lazy Proxy 객체를 로딩할때, 한번에 로딩할 갯수를 지정한다.
줄 37: 줄 43:
   * ''IN'' 절 쿼리에 대해서 2의 제곱단위로 쿼리를 생성한다.   * ''IN'' 절 쿼리에 대해서 2의 제곱단위로 쿼리를 생성한다.
   * [[https://vladmihalcea.com/improve-statement-caching-efficiency-in-clause-parameter-padding/|How to improve statement caching efficiency with IN clause parameter padding - Vlad Mihalcea]]   * [[https://vladmihalcea.com/improve-statement-caching-efficiency-in-clause-parameter-padding/|How to improve statement caching efficiency with IN clause parameter padding - Vlad Mihalcea]]
-  * 위 옵션을 켜지 않으면, ''IN'' 절 쿼리가 Query Plan Cache를 모두 점유해서 메모리가 부족해질수 있고, 메모리가 남아돌더라도 캐시를 모두 ''IN'' 절이 점유해버리므로 별로 좋지 못하다.+  * 위 옵션을 켜지 않으면, ''IN'' 절 쿼리가 ''QueryPlanCache''를 모두 점유해서 메모리가 부족해질수 있고, 메모리가 남아돌더라도 캐시를 모두 ''IN'' 절이 점유해버리므로 별로 좋지 못하다.
   * 또한 RDBMS 의 경우 그 자체 execution plan cache 가 있는데, 이 옵션을 켜면 그에 대한 hit 율도 높아지게 된다.   * 또한 RDBMS 의 경우 그 자체 execution plan cache 가 있는데, 이 옵션을 켜면 그에 대한 hit 율도 높아지게 된다.
  
java/hibernate/performance.txt · 마지막으로 수정됨: 2024/03/04 12:47 저자 kwon37xi