Fetch를 사용하는 NHibernate QueryOver: 여러 SQL 쿼리 및 데이터베이스 적중 설명
NHibernate의 QueryOver를 사용하여 엔터티를 검색하고 관련 목록을 가져오려고 할 때 구문을 사용하면 개발자는 수많은 중복 SQL 쿼리 및 데이터베이스 적중을 경험할 수 있습니다. 이 문제는 Eager 가져오기를 사용할 때 발생합니다.
다음 코드를 고려하세요.
Session.QueryOver<UserRole>() .Fetch(x => x.UsersInRole).Eager .List();
이 쿼리는 다음을 포함한 일련의 데이터베이스 적중을 발생시킵니다.
이 동작은 NHibernate의 Eager 가져오기 전략에서 비롯됩니다. 즉시 가져오기가 활성화되면 관련 컬렉션이 상위 엔터티와 함께 즉시 로드됩니다. 그러나 각 관련 개체에는 검색해야 하는 서로 다른 연결이 있을 수 있으며 이로 인해 추가 쿼리가 발생할 수 있습니다.
제공된 매핑 예에서 UserRole 및 UsersInRole 엔터티는 다대다 관계를 갖습니다. 이 관계로 UserRoles을 즉시 가져오는 경우 세션에는 연결된 UsersInRole이 아닌 검색된 UserRole에 대한 정보만 포함됩니다.
이 문제를 완화하려면 일괄 가져오기를 사용해야 합니다. 컬렉션 매핑에 BatchSize 속성을 설정함으로써 NHibernate는 연관된 각 객체에 대해 개별 쿼리를 실행하는 대신 관련 엔터티를 일괄적으로 검색합니다.
해결책:
HasManyToMany(x => x.UsersInRole) ... .BatchSize(25)
두 컬렉션 맵(클래스 맵 포함)에 배치 크기를 할당하면 수많은 중복 쿼리 대신 여러 쿼리가 실행됩니다. 정확한 쿼리 수는 배치 크기 및 페이지 크기 설정에 따라 다릅니다.
위 내용은 Eager Fetching을 사용하는 NHibernate QueryOver로 인해 여러 데이터베이스 쿼리가 발생하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!