> 데이터 베이스 > MySQL 튜토리얼 > Eager Fetching을 사용하는 NHibernate QueryOver로 인해 여러 데이터베이스 쿼리가 발생하는 이유는 무엇입니까?

Eager Fetching을 사용하는 NHibernate QueryOver로 인해 여러 데이터베이스 쿼리가 발생하는 이유는 무엇입니까?

Mary-Kate Olsen
풀어 주다: 2025-01-05 02:40:41
원래의
323명이 탐색했습니다.

Why Does NHibernate QueryOver with Eager Fetching Cause Multiple Database Queries?

Fetch를 사용하는 NHibernate QueryOver: 여러 SQL 쿼리 및 데이터베이스 적중 설명

NHibernate의 QueryOver를 사용하여 엔터티를 검색하고 관련 목록을 가져오려고 할 때 구문을 사용하면 개발자는 수많은 중복 SQL 쿼리 및 데이터베이스 적중을 경험할 수 있습니다. 이 문제는 Eager 가져오기를 사용할 때 발생합니다.

다음 코드를 고려하세요.

Session.QueryOver<UserRole>()
       .Fetch(x => x.UsersInRole).Eager
       .List();
로그인 후 복사

이 쿼리는 다음을 포함한 일련의 데이터베이스 적중을 발생시킵니다.

  • UserRole 엔터티를 검색하기 위한 초기 쿼리.
  • 각각에 대해 UsersInRole 엔터티를 검색하기 위한 여러 후속 쿼리 UserRole.

이 동작은 NHibernate의 Eager 가져오기 전략에서 비롯됩니다. 즉시 가져오기가 활성화되면 관련 컬렉션이 상위 엔터티와 함께 ​​즉시 로드됩니다. 그러나 각 관련 개체에는 검색해야 하는 서로 다른 연결이 있을 수 있으며 이로 인해 추가 쿼리가 발생할 수 있습니다.

제공된 매핑 예에서 UserRole 및 UsersInRole 엔터티는 다대다 관계를 갖습니다. 이 관계로 UserRoles을 즉시 가져오는 경우 세션에는 연결된 UsersInRole이 아닌 검색된 UserRole에 대한 정보만 포함됩니다.

이 문제를 완화하려면 일괄 가져오기를 사용해야 합니다. 컬렉션 매핑에 BatchSize 속성을 설정함으로써 NHibernate는 연관된 각 객체에 대해 개별 쿼리를 실행하는 대신 관련 엔터티를 일괄적으로 검색합니다.

해결책:

HasManyToMany(x => x.UsersInRole)
...
.BatchSize(25)
로그인 후 복사

두 컬렉션 맵(클래스 맵 포함)에 배치 크기를 할당하면 수많은 중복 쿼리 대신 여러 쿼리가 실행됩니다. 정확한 쿼리 수는 배치 크기 및 페이지 크기 설정에 따라 다릅니다.

위 내용은 Eager Fetching을 사용하는 NHibernate QueryOver로 인해 여러 데이터베이스 쿼리가 발생하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿