2011-02-04 5 views
0

나는 nhiberante 3.0을 사용하여 asp mvc를 사용하여 구축중인 웹 앱을 보유하고 있습니다. 나는 내 데이터를 질의 할 수있는 다음과 같은 코드가 -mhc를 사용하여 nhibernate를 사용하여 eager 로딩 엔티티를 열 때

ICriteria rowCount = session.CreateCriteria(typeof(entity1)); 

rowCount.SetResultTransformer(CriteriaSpecification.DistinctRootEntity) 
       .SetProjection(Projections.RowCount()); 

ICriteria query = session.CreateCriteria(typeof(entity1)); 

query.SetFetchMode("entity2", FetchMode.Eager); 
query.SetResultTransformer(CriteriaSpecification.DistinctRootEntity); 
query.SetFirstResult((pageIndex - 1) * pageSize); 
query.SetMaxResults(pageSize); 

query.Future<entity1>(); 

return new PagedList<entity1>(query.List<cshearin>(), pageIndex, pageSize, rowCount.List<Int32>().FirstOrDefault());  

지금이 내 시야에 올바른 데이터를 반환,하지만 성능이 끔찍한입니다. 엔티티 2를 열망하지 않는다면 성능이 좋습니다. 유일한 문제는보기가 내가 읽은 데이터로 작업하는 것이 좋은 습관이 아니라는 것입니다.

보기를 조금만해도 괜찮습니까? 아니면 나쁜 습관입니까? 나쁜 습관 인 경우 데이터 액세스를 위해이 클래스를 빌드 할 수있는 더 좋은 방법이 있습니까?

아무쪼록 고맙습니다.

편집 - 내 매핑은 매우 간단합니다. 다음은 단순화 된 버전입니다.
entity1 -

<class name="entity1"> 
    <id name="entity1_id"> 
     <generator class="guid.comb"></generator> 
    </id> 

    <property name="column"></property> 
    <property name="column"></property>\ 

    <bag name="entity2" cascade="all"> 
     <key column="entity2_fk" /> 
     <one-to-many class="entity2"/> 
    </bag> 

    </class> 

및 entity2 - 나는 또한 내보기에 전달 예측을 사용하여 조사 할 것이다

<class name="entity2"> 
    <id name="entity2_id"> 
     <generator class="guid.comb"></generator> 
    </id> 

    <many-to-one name="entity1" column="entity2_fk" /> 

    <property name="columnx"></property> 
    <property name="columny"></property> 

    </class> 

- 올바른 해답이 될 수 있습니다.

+0

실제로 평가하려면 매핑을 확인해야합니다. 그러나, 나는 일반적으로 NHibernate Session에 의해 관리 될 필요가 없으므로 엔터티를 내보기로 전달하지 않고 Projections를 대신 사용합니다. 마지막으로 ICriteria에는 'UniqueResult'라는 메서드가 있습니다.이 메서드는 rowCount 쿼리에 사용할 수 있습니다. – Vadim

+0

야드, 엔티티 대신 프로젝션을 사용하는 방법에 대해 자세히 설명해 주시겠습니까? – czuroski

답변

3

성능이 좋지 않은 이유를 찾아야합니다. 프로필러 (SQL Server)와 같은 도구를 사용하여 NH에서 생성 된 쿼리를 보거나 NH가 콘솔 (show_sql) 또는 로그에 기록하도록합니다.

당신은 할 수 있습니다 :

  • 은 하나 하나가 아닌 일괄 entity2를 얻기 위해 일괄 처리 크기의 entity2
  • 메이크업 사용을 얻기 위해 외래 키에 인덱스가 필요합니다.
  • 주문은 최신 데이터를 먼저 읽는 데, 이미 DBMS의 캐시에있을 수 있습니다.
+0

색인을 추가하면 엄청난 도움이되었습니다. 나는 그것을 간과했다. – czuroski

관련 문제