문제:
Nibernate의 QueryOver 구문을 사용하여 엔터티 검색 관련 컬렉션을 사용하면 수많은 데이터베이스 히트가 발생합니다. 이 동작은 대부분 다대다 관계에서 발생합니다.
원인:
NHibernate의 즉시 가져오기 메커니즘은 관계의 외래 키 열에서 발견된 각 고유 값에 대해 별도의 쿼리를 트리거합니다. . 이 문제는 컬렉션이 즉시 가져오기로 표시되었지만 ISession에 필요한 개체가 모두 포함되어 있지 않은 경우에 발생합니다.
예제 매핑:
public class UserRoleMap : ClassMap<UserRole> { public UserRoleMap() { Id(x => x.Id); Map(x => x.RoleName); HasManyToMany(x => x.UsersInRole) .Inverse() .LazyLoad() .Table("UsersInRoles"); } }
시나리오 :
다음이 있다고 가정합니다. 데이터:
Fetch(x => x.UsersInRole)를 사용하여 UserRole을 검색하는 경우 , 첫 번째 쿼리는 User1 및 Role1을 검색합니다. 그러나 세션에 Role1과 관련된 모든 사용자가 포함되어 있지 않기 때문에 NHibernate는 누락된 사용자를 가져오기 위해 여러 개의 추가 쿼리를 실행하므로 성능 저하가 발생합니다.
해결책:
권장되는 솔루션은 배치 크기를 설정하여 NHibernate의 배치 가져오기 메커니즘을 사용하는 것입니다. 컬렉션:
HasManyToMany(x => x.UsersInRole) ... .BatchSize(25)
배치 크기를 25 이상으로 설정하면 NHibernate가 지연 로드 컬렉션에 대해 한 번에 최대 25개의 레코드를 검색하게 됩니다. 이 최적화는 초기 쿼리 또는 최소한의 추가 쿼리 내에서 컬렉션 가져오기를 결합하여 데이터베이스 적중률을 크게 줄입니다.
위 내용은 관련 컬렉션을 가져올 때 다중 데이터베이스 적중을 방지하기 위해 NHibernate QueryOver를 어떻게 최적화할 수 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!