2009-02-24 3 views
5

나는 상당히 깊은 객체 그래프 (5-6 노드)를 가지고 있으며, NHProf가 "Select N + 1"문제가 있음을 알리고있다. 해야 할 것).Fluent NHibernate 선택 n + 1

제가 알고 두 솔루션입니다

  1. 열망로드 아이
  2. 브레이크 떨어져 내 개체 그래프 (열망로드) 정말 하나 싶지 않아

(비록 내가 성장할 것을 생각하면 나중에 그래프를 분해 할 수도 있지만)

현재로서는 ....

NHibernate (FluentNHibernate)가 자식에 접근하려고 시도 할 때마다 select-n + 1-ing 대신에 그들을 반복 할 때마다 한 번에로드 할 수 있다고 말할 수 있습니까?

"무제한 결과 집합"이 나옵니다. 아마도 같은 문제 일 수 있습니다. 가능하다면 위의 해결 방법으로 해결할 것입니다.

각 자식 컬렉션 (그래프 전체)은 약 20 명의 회원 만 가질 수 있지만 20^5는 많이 있으므로 루트를 얻을 때 모든 것을 열심히로드하고 싶지는 않습니다. 내가 가까이 다가 갈 때마다 어린이 수집.

편집 : 추가 고려 사항 ... 아이들을 렌더링하고 싶을 때 페이징을 도입하려면 어떻게해야합니까? 여기에 내 개체 그래프를 깨뜨리면 안 되나요? 아니면이 모든 문제를 해결하기 위해 사용할 수있는 비열한 점이 있습니까?

답변

9

이 시나리오를 처리하기 위해 특정 nhibernate 쿼리를 만드는 대신 도메인 모델을 사용하는 방식을 추구하고 싶습니다. 이 점을 감안할 때 컬렉션에 적용 할 수있는 배치 크기 특성을 살펴 보는 것이 좋습니다. 유창 NHibernate에 유창 인터페이스는 아직이 속성을 지원하지 않지만, 작품으로 주위를 사용할 수 있습니다 :

HasMany(x => x.Children).AsSet().SetAttribute("batch-size", "20") 

을 정확한 시나리오에 대한 정보의 일반적인 부족을 감안할 때, 나는 배치 크기가인지 확실히 말할 수 없다 이상적인 해결책이지만, 나는 확실히 당신이 그것을주는 것이 좋습니다. 당신이 이미하지 않은 경우, 당신이 읽을 제안 :

http://www.nhforge.org/wikis/howtonh/lazy-loading-eager-loading.aspx

http://nhibernate.info/doc/nhibernate-reference/performance.html

NHibernate에 성능 문서를 어떻게 배치 크기의 작품을 설명합니다.

편집 : 도메인 모델에서 페이지를 이동할 방법을 모르겠습니다. 페이징이 필요한 시나리오에 대해 NH 쿼리를 작성하는 것이 좋습니다.

+0

"이 시나리오를 처리하기 위해 특정 nhibernate 쿼리를 만드는 대신 도메인 모델을 사용하는 방식을 추구하고 싶습니다." 확실히. 마지막으로 원하는 것은 특정 쿼리입니다. 그 물건을 체크 아웃, –

+3

노트 - "유창 - nh 인터페이스 이제 BatchSize() 속성을 지원하지 않습니다 – KevinT

0

편집 : 군더더기 .... 내가 아이들을 렌더링하는 을 할 때 내가 페이징을 소개 할 경우? 내가 여기 내 개체 그래프를 깨뜨릴 수 있습니까, 아니면 일부는 이런 모든 문제를 해결하기 위해 고용 할 수있는가 012은 ?

글쎄, 아이들 만로드하면 페이지 할 수 있습니다 :). 그러나 LoadParent와 PageChildren과 같은 것을 원한다면, 그렇게 할 수 있다고 생각하지 않습니다.