我有一個NHibernate的ASP.NET應用程序,由於某些原因,一些開發人員忘記關閉會話在一些頁面(如20我認爲),我知道最好的解決方案是通過每個頁面並確保會話正確關閉,但由於代碼已在生產中,因此我無法進行這種移動。所以我試圖找到一種方法來獲取會話工廠中的所有打開的會話,然後使用母版頁或使用額外的進程關閉它,但我找不到這樣做的方法。NHibernate:獲取所有打開的會話
那麼,有沒有辦法讓所有打開的會話?或者可能設置會話空閒超時或什麼的,你有什麼建議?謝謝你的建議。
我有一個NHibernate的ASP.NET應用程序,由於某些原因,一些開發人員忘記關閉會話在一些頁面(如20我認爲),我知道最好的解決方案是通過每個頁面並確保會話正確關閉,但由於代碼已在生產中,因此我無法進行這種移動。所以我試圖找到一種方法來獲取會話工廠中的所有打開的會話,然後使用母版頁或使用額外的進程關閉它,但我找不到這樣做的方法。NHibernate:獲取所有打開的會話
那麼,有沒有辦法讓所有打開的會話?或者可能設置會話空閒超時或什麼的,你有什麼建議?謝謝你的建議。
據我所知,沒有從會話工廠獲取開放會話列表的支持。我有自己的方法來關注公開會話,我使用這種構造:
創建一個弱引用到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;
}
這樣我保持打開的會話需要的時候我可以查詢的列表。也許這符合你的需求?
另一種方法可能是通過NHibernate統計數據,但您需要先啓用它。如果你想知道如何,讓我知道,因爲我喜歡我自己的實現。 – TedOnTheNet
您的會議如何管理? (每個請求等) – AlexCuse
你可以在會話工廠編寫一個包裝,但是你怎麼知道哪個會話可以關閉?也許「最好的解決方案」是唯一的解決方案。 –
感謝Alex和GertArnold,會話是在每個頁面的每個請求中進行管理的,所以如果我們得到一些客戶端詳細信息,例如一個會話被打開然後關閉(當然,它會被關閉,但在某些情況下不會)。 – doc