2012-02-01 2 views
1

나는 내 asp.net mvc 응용 프로그램에서 NHibernate를 연결했습니다그것은 세션을 처리하지 나쁜가요

ISession은 저장소에 주입됩니다. 대화마다 세션이 필요하므로 요청 패턴 당 세션을 사용할 수 없습니다.

NHibernate 세션은 여러 HTTP 요청에서 사용됩니다. 개체 그래프가 크고 모든 요청에 ​​전체 그래프를로드하고 싶지 않습니다. 그래서 Session은 사용자 HttpSession에 저장됩니다.

ISession의 라이프 사이클

는 StructureMap로 구성되어 있습니다 : 대화의 끝에

For<ISession>().LifecycleIs(new HttpSessionLifecycle()).Use(x => 
{ 
    var sessionSource = x.GetInstance<ISessionSource>(); 
    return sessionSource.CreateSession(); 
}); 

내가 ISession을 취소

Session.Clear() 

를 호출합니다.

사용자가 새 대화를 만들면 StructureMap에서 새 ISession을 만듭니다. 나는 Session을 처리하는 방법을 찾지 못했습니다.

그럼 처분하지 않는 것이 좋습니까? 이 연결이 데이터베이스에 연결되어 있습니까?

+0

IDisposable을 구현하지 않은 경우 ... 그럼 Dispose()가없고 Disposing이 의미가 없습니다. 문서가 뭐라고 말합니까? –

+0

ISession은 일회용이므로 모범 사례를 폐기해야합니다. 하지만 응용 프로그램의 세션이 여러 페이지 요청에 걸쳐 있어야합니다. – ms007

+0

대화 패턴 당 세션이 필요하기 때문에 요청 패턴 당 세션을 사용할 수 없다고 말하면 동일한 요청에 대해 여러 HTTP 요청에서 세션을 보류하려는 것입니다 사용자? 유스 케이스를 더 자세히 설명 할 수 있다면 문제를 이해하는 것이 도움이 될 것입니다. 감사. –

답변

2

일반적으로 NHibernate는 DB에 열린 연결을 오래 유지하지 못합니다. SQL Server 연결 풀을 사용하여 연결을 빠르게 가져 와서 반환합니다. 따라서 열린 연결의 측면에서 세션을 처리하지 않는 것이 좋습니다.

그러나 세션도/단지 다음과 같은 문제에 대한 인식이 기능이 있다는 것을 명심하고 당신에게 또한

0

을 쫓아 수도, 트랜잭션을 커밋 개체에 모든 변경 사항을 추적하고 처분에 DB에서 그들을 플러시 :

일부 시나리오에서는

https://nhibernate.jira.com/browse/NH-3046

(당신이 트랜잭션을 사용하지 않거나 자주 트랜잭션의 롤백을 수행하는 경우 경우) 장기 생활 세션은 많은 메모리를 "먹을"수 있습니다. 그러나 할당 된 모든 메모리는 세션이 GC에 의해 처리되고 수집 될 때 해제됩니다.