JPA 및 Hibernate에서 N 1 문제 해결
JPA 및 Hibernate에서 여러 쿼리가 실행될 때 N 1 쿼리 문제가 발생합니다. 관련 데이터를 검색하므로 데이터 가져오기가 비효율적입니다. 이를 해결하기 위해 Hibernate는 다양한 기술을 제공합니다.
N 1 문제 이해
초기 쿼리가 기본 엔터티를 검색하고 후속 쿼리가 트리거될 때 문제가 발생합니다. 관련 데이터를 가져옵니다. 예를 들어, 관련 Post 엔터티를 프리페치하지 않고 PostComment 엔터티를 페치하면 Hibernate는 액세스된 각 Post 인스턴스에 대해 추가 쿼리를 실행하게 됩니다.
Hibernate의 솔루션
1. 조인 가져오기:
"조인 가져오기" 전략을 활용하면 단일 쿼리에서 기본 엔터티와 함께 관련 데이터를 검색할 수 있습니다. 이 예에서는 다음을 사용할 수 있습니다.
List<PostComment> comments = entityManager.createQuery("select pc from PostComment pc join fetch pc.post where pc.review = :review", PostComment.class) .setParameter("review", review) .getResultList();
2. 컬렉션 프리페칭:
기본 엔터티 컬렉션과 관련 데이터의 추가 컬렉션을 가져올 때 후자를 프리페치하는 것이 좋습니다. 한 가지 옵션은 초기 쿼리에서 컬렉션을 미리 가져오는 것입니다.
List<PostComment> comments = entityManager.createQuery("select pc from PostComment pc join fetch pc.post where pc.review = :review", PostComment.class) .setParameter("review", review) .getResultList(); ListpostTags = entityManager.createQuery("select pt from PostTag pt where pt.post in (:commentPosts)", PostTag.class) .setParameter("commentPosts", comments) .getResultList();
3. 보조 쿼리:
프리페칭이 효율적이지 않거나 여러 하위 연결을 가져와야 하는 경우 보조 쿼리 전략을 사용할 수 있습니다. 기본 쿼리로 기본 엔터티를 검색하고 후속 쿼리를 사용하여 관련 데이터를 가져옵니다.
db-util을 사용한 자동 감지
db-util 라이브러리는 N 1 쿼리 문제를 감지하는 자동화된 수단입니다. JUnit 어설션을 사용하면 생성된 SQL 문의 예상 개수를 검증하여 개발 프로세스 초기에 문제를 포착할 수 있습니다.
위 내용은 JPA 및 Hibernate에서 N 1 쿼리 문제를 어떻게 해결할 수 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!