쿼리 문제:
사용 시 즉시 로드를 사용하여 관련 목록을 가져오는 QueryOver에서 여러 데이터베이스 적중이 발생하여 수많은 오류가 발생합니다. 별도의 SQL 쿼리.
예:
Session.QueryOver<UserRole>() .Fetch(x => x.UsersInRole).Eager .List();
설명:
이 동작은 많은 쿼리의 특성으로 인해 발생합니다. - 대 다 관계. 예제 매핑에서 UserRole 엔터티는 UsersInRole 엔터티와 다대다 관계를 갖습니다. Eager 로딩이 사용되면 NHibernate는 검색된 각 UserRole 엔터티에 대해 모든 관련 UsersInRole 엔터티를 로드하려고 시도합니다.
그러나 세션에 아직 모든 관련 엔터티가 포함되어 있지 않을 수 있으므로 이러한 관계를 검색하기 위해 여러 SQL 쿼리가 실행됩니다. 초기 쿼리는 UserRole 엔터티를 검색하고 후속 쿼리는 각 UserRole에 대해 실행되어 관련 UsersInRole 엔터티를 검색합니다.
해결책:
SQL 쿼리를 최소화하는 효과적인 솔루션 일괄 가져오기를 사용하는 것입니다. HasManyToMany 매핑에 BatchSize 속성을 설정함으로써 NHibernate는 단일 SQL 쿼리에서 여러 관련 엔터티를 가져올 수 있습니다.
HasManyToMany(x => x.UsersInRole) ... .BatchSize(25)
배치 크기를 적절한 값(예: 25)으로 설정하면 NHibernate는 SQL 쿼리 수를 제한하여 총 데이터베이스 적중 횟수를 줄이고 성능을 향상시킵니다.
또한 클래스 맵에서 배치 크기를 설정합니다. 전체 가져오기 전략을 최적화하는 데도 도움이 될 수 있습니다.
위 내용은 Eager Fetching을 사용하는 NHibernate QueryOver가 왜 여러 SQL 쿼리를 생성합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!