2011-10-21 2 views
2

NHibernate가있는 ASP.NET 응용 프로그램을 가지고 있습니다. 몇 가지 이유로 일부 개발자가 일부 페이지에서 세션을 닫지 못하는 것을 잊었습니다 (생각한 것처럼 20 개). 가장 좋은 해결책은 각각을 통과하는 것입니다. 페이지가 올바르게 닫혔는지 확인하십시오. 코드가 이미 제작 중이기 때문에 이러한 종류의 작업을 수행 할 수 없습니다. 그래서 세션 팩토리에서 열린 세션을 모두 가져온 다음 마스터 페이지를 사용하거나 추가 프로세스를 사용하여 세션을 닫을 수있는 방법을 찾으려고했으나 그렇게 할 수있는 방법을 찾을 수 없습니다.NHibernate : 열린 모든 세션을 얻으십시오

그래서 열린 세션을 모두 가져 오는 방법이 있습니까? 또는 세션 유휴 시간 초과 또는 무언가를 설정할 수 있습니다. 무엇을 제안합니까? 덕분에 조언.

+3

세션 관리 방법은 무엇입니까? (요청 당, 등 ...) – AlexCuse

+1

세션 팩터를 래퍼로 작성할 수는 있지만 어떤 세션을 닫을 수 있는지 어떻게 알 수 있습니까? 어쩌면 "최상의 솔루션"이 유일한 해결책 일 수 있습니다. –

+0

Alex와 GertArnold에게 감사드립니다. 각 페이지의 요청마다 세션이 관리되므로 클라이언트 세부 정보를 얻는 경우 한 세션을 연 다음 닫습니다 (닫히지 만 경우에 따라 다름). – doc

답변

1

내가 아는 한, 세션 팩토리에서 열린 세션 목록을 가져올 수는 없습니다. 공개 세션을 지켜 볼 수있는 나름의 방법이 있습니다.이 구성을 사용합니다.

약한 참조를 사용하여 클래스를 만듭니다. 당신은 가비지 컬렉터를 매치를 중지하지 않습니다이 방법은 세션 쓰레기 수집하는 경우 :

public class SessionInfo 
{ 
    private readonly WeakReference _session; 

    public SessionInfo(ISession session) 
    { 
     _session = new WeakReference(session); 
    } 

    public ISession Session 
    { 
     get { return (ISession)_session.Target; } 
    } 
} 

이 열려있는 세션을 저장하는 목록을 만들 :

List<SessionInfo> OpenSessions = new List<SessionInfo>(); 

과 DAL (데이터 액세스 계층)에서

I 이 방법을 사용하십시오 :

public ISession GetNewSession() 
{ 
    if (_sessionFactory == null) 
     _sessionFactory = createSessionFactory();  
    ISession session = _sessionFactory.OpenSession(); 
    OpenSessions.Add(new SessionInfo(session)); 
    return session; 
} 

이 방법은 필자가 필요할 때 열어 볼 수있는 목록을 유지 관리합니다. 아마도 이것이 당신의 필요를 충족시킬 것입니까?

+0

다른 방법은 NHibernate 통계를 통해 이루어질 수 있지만 먼저 활성화해야합니다. 내가 어떻게 내 자신의 구현을 좋아하는지 알고 싶다면 알려주세요. – TedOnTheNet