2017-02-14 4 views
1

나는 새 메신저가 1 초마다 테이블에 삽입되어야하는 프로젝트를 진행하고 있습니다. EntityFramework에는 컨텍스트의 수명을 가능한 한 짧게 유지하는 것이 더 나은 선택이되는 연결 풀링이라는 것이 있습니다. 우리는 컨텍스트를 처리합니다. Nhibernate 세션에도 적용됩니까?Nhibernate 및 세션 풀링

ISessionFactory sf = cfg.BuildSessionFactory(); 
ISession session = sf.OpenSession(); 
While(true) 
{ 
//....... 
    using (var tran = session.BeginTransaction()) 
    { 
     session.SaveOrUpdate(msg); 
     tran.Commit();       
    } 
    Thread.Sleep(1000); 
} 

또는

ISessionFactory sf = cfg.BuildSessionFactory(); 
While(true) 
{ 
//....... 
    using(var session = sf.OpenSession()) 
    { 
    using (var tran = session.BeginTransaction()) 
    { 
     session.SaveOrUpdate(msg); 
     tran.Commit();       
    } 
    Thread.Sleep(1000); 
    } 
} 

모두 작동하는 것,하지만 난 어느 쪽을 사용하여야한다?

+0

[가능한 한 Hibernate 세션을 열 수 있습니까?] (http://stackoverflow.com/questions/1243835/how-long-can-should-an-nhibernate-session-be-kept)의 가능한 복제본입니다. -open) – Fran

+0

'SessionFactory' 인터페이스에서'OpenStatelessSession' 메소드를 살펴볼 가치가 있습니다. 무국적 세션 개념은 여러분이하고있는 것에 적합합니다. –

답변

1

글쎄, 난 단지 귀하의 질문에 대답하기로 결정한 경우 :

코드 블록이 더 적합합니다. 사실, 연결 풀링은 NHibernate와 아무 관련이 없습니다. 기본 RDBMS의 동작입니다.

NHibernate에서 SessionFactory을 생성하는 것은 비용이 많이 들고 응용 프로그램 수명 기간 동안 한 번만 (시작시 이상적으로) 수행되어야합니다. ISession을 만들면 많은 비용이 들지 않습니다. 세션은 가능한 한 짧은 leaved이어야합니다.

바로 대답보다 더 많은 : 그렇다 짧은 잎이 달린 세션

은 또한 UnitOfWork을 구현하는 것을 고려해야를 ("세션 당 대화"제대로 거래와 세션을 사용 예) 첫 번째 레벨 캐시의 혜택을 개선하고 일괄 처리.

첫 번째 수준 캐시는 세션 당 있습니다. 새 세션에서 각 DB 호출을 실행하면 효과적으로 캐싱을 활용할 수 없습니다.

일괄 처리의 경우에도 마찬가지입니다. 일괄 처리는 거래 처리 방법에 따라 수행됩니다. tran.Commit();로 전화하면 nhSession.FlushMode, nhSession.SetBatchSize과 같은 다른 속성과 함께 중요한 역할을합니다. 문서 this을 참조하십시오.
일괄 처리를 구현하려면 코드 블록을 먼저 코드 블록으로 개선하고 using 블록에서 트랜잭션을 커미트하는 대신 루프 반복의 100 회 (또는 10 회 또는 500 회) 반복을 수행하는 것이 좋습니다.

thisthis 질문을 참조하십시오.

this 대답을 @Fran이 (가) 의견으로 말한 내용을 참조하십시오.

+0

고마워요! 이것은 나를 많이 돕는다. 하지만 필자의 경우 소스 데이터는 물리적 장치에서 가져와 1 초당 하나씩 생성됩니다. 따라서 내가 말한 것처럼 배치 작업을 수행하면 세션이 커밋되고 처리되기 전에 세션이 500 초 동안 실행되어야합니다. 이는 첫 번째 규칙을 위반할 수 있습니다. – joe

+0

동의 함; 이 경우 어쨌든 일괄 처리가 도움이되지 않습니다. –