2011-10-21 5 views
2

何らかの理由でNHibernateを使用したASP.NETアプリケーションを使用していますが、いくつかのページでセッションを閉じるのを忘れた開発者はほとんどありませんでした。ページが正しくセッションが閉じられていることを確認してください。しかし、コードがすでに実稼働中であるため、そのような動きはできません。だから私は、セッション・ファクトリーで開かれたセッションをすべて取得し、マスター・ページを使用してクローズするか、追加のプロセスを使用する方法を見つけようとしていましたが、その方法を見つけることができません。NHibernate:開かれたすべてのセッションを取得する

オープンされたセッションをすべて取得する方法はありますか?またはセッションのアイドルタイムアウトか何かを設定することができます。何をお勧めしますか?アドバイスをありがとう。

+3

セッションはどのように管理されていますか? (リクエストごとなど) – AlexCuse

+1

セッションファクトリの周りにラッパーを書くことはできますが、どのセッションを閉じることができるかはどのように判断できますか?たぶん "最高のソリューション"が唯一の解決策です。 –

+0

AlexとGertArnoldに感謝します。セッションは各ページのリクエストごとに管理されています。たとえば、あるセッションが開かれて閉じられた場合などです(閉鎖されていると思われますが、そうでない場合もあります)。 – doc

答えて

1

私が知る限り、セッションファクトリから開いているセッションのリストを取得するサポートはありません。私は開かれたセッションを監視する独自の方法を持っており、私はこの構成を使用します:

弱い参照を使用してクラスを作成します。セッションはゴミが収集されている場合は、ガベージコレクタを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に(データアクセス層)をIこの方法があります:

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

このようにして、私は必要なときに照会できるオープンセッションのリストを維持します。おそらく、これはあなたのニーズを満たしていますか?

+0

別の方法はNHibernateの統計を経由するかもしれませんが、まずそれを有効にする必要があります。私が自分の実装が好きなので、どのように知りたいのですか、私に知らせてください。 – TedOnTheNet

関連する問題