세션의 캐시는 상호 관련된 객체 그래프와 함께 저장됩니다. 기본적으로 최대 절전 모드가 데이터베이스에서 고객 객체를로드하면 모든 관련 주문 객체가 동시에로드됩니다. 고객 및 주문 수업을 예로 들어 보자 주문 테이블의 Customer_ID 외국 키가 Null이 허용 될 수 있다고 가정합니다.
다음 Session的find() 메소드는 데이터베이스의 모든 고객 객체를 검색하는 데 사용됩니다.
List customerLists=session.find("from Customer as c");
위의 find() 메소드를 실행할 때 Hibernate는 먼저 고객 테이블의 모든 레코드를 쿼리 한 다음 각 레코드의 ID를 기반으로 참조 관계로 주문 테이블을 쿼리합니다. Hibernate는 다음과 같은 선정 문을 실행합니다.
* 고객에서 *를 선택하십시오.
Customer_id = 1의 주문에서 *를 선택하십시오.
Customer_id = 2 인 Orders에서 *를 선택하십시오.
customer_id = 3 인 순서에서 *를 선택하십시오.
Customer_id = 4의 주문에서 *를 선택하십시오.
위의 5 개의 선택 문을 통해 최대 절전 모드는 최종적으로 4 개의 고객 객체와 5 개의 주문 객체를로드하여 메모리에 관련 객체 그래프를 형성합니다.
Hibernate는 고객과 관련된 주문 개체를 검색 할 때 기본 검색 정책을 사용합니다. 이 검색 전략에는 두 가지 주요 단점이 있습니다.
(1) 선택 문의 수는 너무 크고 데이터베이스에 대한 자주 액세스하면 검색 성능에 영향을 미칩니다. n 고객 객체를 쿼리 해야하는 경우 n+1 선택 쿼리 문을 실행해야합니다. 이것은 클래식 N+1 선택 쿼리 문제입니다. 이 검색 전략은 SQL의 연결 쿼리 기능을 사용하지 않습니다. 예를 들어, 위의 5 개의 선택 문은 다음 1 Select 문으로 완전히 완료 될 수 있습니다.
선택 *에서 선택한 OUTER AND OUT ORDERS를 선택하십시오
customer.id = orders.customer_id에서
위의 select 문은 SQL의 왼쪽 외부 조인 쿼리 함수를 사용하여 고객 테이블의 모든 레코드와 일치 주문 테이블의 레코드를 선택할 수 있습니다.
(2) 애플리케이션 논리가 고객 객체에만 액세스 할 필요가 있지만 주문 객체에 액세스 할 필요가있는 상황에서 주문 오브젝트로드는 완전히 불필요합니다. 이 불필요한 순서 대상은 많은 메모리 공간을 낭비합니다.
위의 문제를 해결하기 위해 Hibernate는 지연된 검색 전략과 긴급한 왼쪽 연결 검색 전략의 두 가지 검색 전략을 제공합니다. 지연된 검색 전략은 응용 프로그램에 액세스 할 필요가없는 관련 객체의 중복로드를 피할 수 있습니다. 긴급한 왼쪽 외부 연결 검색 전략은 SQL의 외부 연결 쿼리 기능을 최대한 활용하고 선택 문의 수를 줄일 수 있습니다.
데이터베이스에 액세스 할 때 성능 문제를 고려해야합니다. 1 대 마니 관계를 설정 한 후 전설적인 N +1 문제가 쿼리에서 발생합니다.
1) 1에서 1에서 1 정사각형에서 N 물체를 찾을 수 있고 N 객체와 관련된 세트를 꺼내야하므로 원래 SQL 쿼리가 N +1이됩니다.
2) 많은 ~ 1. 여러 당사자에서 M 객체를 쿼리하면 M 객체에 해당하는 1 파티 객체가 꺼지고 M+1이됩니다.
1) Lazy = True, Hibernate3은 이미 Lazy = true로 기본적으로 기본적으로; Lazy = true 일 때 관련 객체는 즉시 쿼리되지 않습니다. 쿼리 조치는 관련 오브젝트 (속성에 액세스, 비 ID 필드에 액세스) 일 때만 발생합니다.
2) 레벨 2 캐시. 객체가 쿼리보다 업데이트, 삭제 및 추가되면 레벨 2 캐시의 적용은 N +1 문제를 두려워하지 않습니다. 첫 번째 쿼리가 느리더라도 캐시 히트는 나중에 매우 빠르기 때문입니다.
다른 솔루션과 다른 아이디어이지만 두 번째 아이디어는 N +1을 다시 사용합니다.
3) 물론 fetch=join(annotation : @ManyToOne() @Fetch(FetchMode.JOIN))
위의 내용은 최대 절전 모드 N+1 문제에 대한이 기사의 간단한 토론에 관한 것이며, 모든 사람에게 도움이되기를 바랍니다. 관심있는 친구는이 사이트의 다른 관련 주제를 계속 참조 할 수 있습니다. 단점이 있으면 메시지를 남겨 두십시오. 이 사이트를 지원해 주신 친구들에게 감사드립니다!