JPA 및 Hibernate에서 N 1 쿼리 문제 해결
N 1 문제는 쿼리가 N 레코드를 검색하고 후속 쿼리가 관련 항목을 가져올 때 발생합니다. 추가 N개의 쿼리로 이어집니다. 이는 초기 쿼리 중에 연관을 가져오지 않을 때 Hibernate에서 발생할 수 있습니다.
원인과 결과
설명하기 위해 PostComment 엔터티를 검색하는 다음 JPA 쿼리를 고려하십시오.
List<PostComment> comments = entityManager.createQuery("select pc from PostComment pc where pc.review = :review", PostComment.class) .setParameter("review", review) .getResultList();
이후에 주석을 반복하고 게시물 연결에 액세스하면 Hibernate는 다음 SQL을 발행합니다. 명령문:
SELECT pc.id AS id1_1_, pc.post_id AS post_id3_1_, pc.review AS review2_1_ FROM post_comment pc WHERE pc.review = 'Excellent!' INFO - Loaded 3 comments SELECT pc.id AS id1_0_0_, pc.title AS title2_0_0_ FROM post pc WHERE pc.id = 1 INFO - The post title is 'Post nr. 1' SELECT pc.id AS id1_0_0_, pc.title AS title2_0_0_ FROM post pc WHERE pc.id = 2 INFO - The post title is 'Post nr. 2' SELECT pc.id AS id1_0_0_, pc.title AS title2_0_0_ FROM post pc WHERE pc.id = 3 INFO - The post title is 'Post nr. 3'
여기서 각 댓글에 대한 Post 엔터티를 가져오기 위해 세 가지 추가 쿼리가 실행됩니다. 이것이 N 1 쿼리 문제입니다.
해결 방법
이 문제를 해결하려면 JOIN FETCH 키워드를 사용하여 필요한 연결을 적극적으로 가져올 수 있습니다.
List<PostComment> comments = entityManager.createQuery("select pc from PostComment pc join fetch pc.post p where pc.review = :review", PostComment.class) .setParameter("review", review) .getResultList();
여러 하위 연결의 경우 초기 쿼리에서 하나의 컬렉션을 가져오고 나머지는 보조를 통해 로드하는 것이 좋습니다.
자동 감지
N 1 문제를 감지하려면 SQL 로깅을 사용하여 통합 테스트를 구현하고 생성된 SQL 문의 예상 개수를 확인하는 어설션을 구현하는 것이 좋습니다. db-util과 같은 도구가 이 프로세스에 도움이 될 수 있습니다.
위 내용은 JPA 및 Hibernate의 N 1 쿼리 문제를 어떻게 해결할 수 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!