2010-01-25 2 views
1

우리는 ORM을 위해 NHibernate를 사용하고 우리 프로그램의 초기화 단계에서 DB로부터 어떤 클래스 T의 인스턴스를 많이로드해야합니다. 우리의 응용 프로그램에서NHibernate 오픈 세션을 DB에 연결하기 (NHibernate와 DB 세션 결합)

는 모든 인스턴스를 추출 다음 코드는 영원히 취합니다 NHibernate에 사용

public IList<T> GetAllWithoutTransaction() 
{ 
    using (ISession session = GetSession()) 
    { 
     IList<T> entities = session 
      .CreateCriteria(typeof(T)) 
      .List<T>(); 
     return entities; 
     } 
    } 
} 

내가 실제 SQL 프레임 워크의 사용은 쿼리 것을 발견 로그 :

{ 
    Load a bunch of rows from a few tables in the DB (one SELECT statement). 

    for each instance of class T 
    { 
     Load all the data for this instance of class T from the abovementioned rows 
     (3 SELECT statements). 
    } 
} 

3 개의 SELECT 문이 결합됩니다. 즉, 두 번째는 첫 번째에 종속적이고 세 번째는 두 번째에 종속됩니다. 알 수 있듯이 SELECT 문의 수가 수백만 개에 달해 DB에 대한 모든 호출에서 직접 발생하는 엄청난 오버 헤드가 발생합니다 (각각은 "DB 세션 열기", "DB 세션 닫기"등). .), 비록 우리가 하나의 NHibernate 세션을 사용하고있다.

내 질문은 : 나는 그 SELECT 문을 하나의 큰 SELECT 문으로 통합하려고합니다. 우리는 멀티 쓰레드를 실행하지 않고 init 단계에서 어떤 식 으로든 DB를 변경하지 않습니다.

이 작업을 수행하는 한 가지 방법은 내 자신의 개체를 정의하고 NHibernate를 사용하여 매핑하는 것입니다. NHibernate는 신속하게로드되고 모든 쿼리를 하나의 쿼리로로드하지만이 명령문에 사용 된 조인 작업을 구현해야합니다. 그리고 악화 - ORM 추상화를 깨뜨립니다. 일부 구성으로이 작업을 수행 할 수있는 방법이 있습니까?

고마워요!

+0

당신이 배치 크기로 재생 시도? – hackerhasid

+0

NHibernate를 처음 접한다면 nhibernate 프로파일 러를 살펴볼 수 있습니다. – Min

+0

NHibernate는 일괄 처리를 위해 만들어지지 않았습니다. 나는 99 %의 질의를 위해 NHibernate를 사용하지만, 일괄 처리를 위해 ETL이나 일반 SQL이 더 잘 작동 할 수도있다. – Paco

답변

3

이것은 SELECT N+1 problem으로 알려져 있습니다. 당신은 조인 (FetchMode.Eager)을 배치 할 곳을 결정할 필요가있다.

0

SQL에서 단일 쿼리로 쿼리를 작성할 수 있다면, NHibernate에서 단일 쿼리로 실행할 수있다. 추상화).

이 시나리오에서 정말로 원하는 것이 열렬한로드 인 경우 게으른로드에 대한 몇 가지 관계/클래스 설정이있는 것으로 보입니다.

NHibernate 문서에는 이것에 대한 좋은 정보가 많이 있습니다. 당신은 여기에서 시작할 수 있습니다

http://www.nhforge.org/doc/nh/en/index.html#performance-fetching

+0

고마워! 아직 해결 방법이 없지만 Mauricio의 대답 방향으로 해결책을 찾아야합니다. 내가 도착하면 알려 드리겠습니다. –

+0

마침내 NHibernate가 fetch = "join"과 그 모든 것을 사용하여 모든 쿼리를로드하도록 구성 할 수있었습니다. 중요한 문제는 원형 의존성이 있다는 것입니다. 클래스 T는 T 유형의 인스턴스 목록을 가지고 있으며,이를 위해 중간 매핑을 정의해야했습니다. 모든 도움을 주셔서 다시 한 번 감사드립니다. –

관련 문제