NHibernate QueryOver의 즉시 로드로 인해 여러 데이터베이스 쿼리가 발생함
NHibernate QueryOver를 사용하여 관련 목록의 즉시 가져오기를 수행할 때 다음과 같은 결과가 발생할 수 있습니다. 여러 데이터베이스 쿼리에서. 이로 인해 데이터베이스 트래픽이 크게 증가하고 성능이 저하될 수 있습니다.
다음 시나리오를 고려하십시오.
Session.QueryOver<UserRole>() .Fetch(x => x.UsersInRole).Eager .List();
이 쿼리는 UserRoles 모음을 선택하고 관련 UsersInRole을 적극적으로 가져오려고 시도합니다. 그러나 이로 인해 여러 개의 개별 데이터베이스 쿼리가 발생합니다.
복수 원인 쿼리
NHibernate는 관련 엔터티를 효율적으로 검색하기 위해 일괄 가져오기를 사용합니다. 그러나 관련 엔터티 수가 배치 크기를 초과하는 경우 추가 쿼리가 필요합니다. 위 시나리오에서는 배치 크기가 너무 작아서 하나의 쿼리로 모든 UsersInRole을 검색할 수 없습니다.
해결책: 배치 크기 조정
이 문제를 해결하려면 Eager 가져오기에 사용되는 배치 크기를 조정할 수 있습니다. 더 큰 배치 크기를 설정함으로써 NHibernate는 단일 쿼리에서 더 많은 관련 엔터티를 가져오려고 시도합니다. 이렇게 하면 데이터베이스 적중 횟수를 크게 줄일 수 있습니다.
다음과 같이 매핑을 수정합니다.
public class UserRoleMap : ClassMap<UserRole> { public UserRoleMap() { ... HasManyToMany(x => x.UsersInRole) ... .BatchSize(25); } }
배치 크기를 25로 설정하면 NHibernate가 쿼리당 최대 25개의 UsersInRole 엔터티를 가져오도록 지시합니다. . 이로 인해 쿼리 수가 줄어들고 성능이 향상될 수 있습니다.
추가 고려 사항
위 내용은 NHibernate QueryOver의 즉시 로딩으로 인해 여러 데이터베이스 쿼리가 발생하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!