2011-10-21 86 views
2

我有一個NHibernate的ASP.NET應用程序,由於某些原因,一些開發人員忘記關閉會話在一些頁面(如20我認爲),我知道最好的解決方案是通過每個頁面並確保會話正確關閉,但由於代碼已在生產中,因此我無法進行這種移動。所以我試圖找到一種方法來獲取會話工廠中的所有打開的會話,然後使用母版頁或使用額外的進程關閉它,但我找不到這樣做的方法。NHibernate:獲取所有打開的會話

那麼,有沒有辦法讓所有打開的會話?或者可能設置會話空閒超時或什麼的,你有什麼建議?謝謝你的建議。

+3

您的會議如何管理? (每個請求等) – AlexCuse

+1

你可以在會話工廠編寫一個包裝,但是你怎麼知道哪個會話可以關閉?也許「最好的解決方案」是唯一的解決方案。 –

+0

感謝Alex和GertArnold,會話是在每個頁面的每個請求中進行管理的,所以如果我們得到一些客戶端詳細信息,例如一個會話被打開然後關閉(當然,它會被關閉,但在某些情況下不會)。 – doc

回答

1

據我所知,沒有從會話工廠獲取開放會話列表的支持。我有自己的方法來關注公開會話,我使用這種構造:

創建一個弱引用到ISession的類。這樣,你就不會interupt垃圾收集,如果會話被垃圾回收:

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(數據訪問層)在我有這樣的方法:

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

這樣我保持打開的會話需要的時候我可以查詢的列表。也許這符合你的需求?

+0

另一種方法可能是通過NHibernate統計數據,但您需要先啓用它。如果你想知道如何,讓我知道,因爲我喜歡我自己的實現。 – TedOnTheNet

相關問題