NHibernate:获取所有打开的会话

时间:2011-10-21 15:01:31

标签: asp.net nhibernate session sessionfactory

我有一个带有NHibernate的ASP.NET应用程序,由于某些原因,很少有开发人员忘记关闭某些页面中的会话(比如我认为的20个),我知道最好的解决方案是遍历每个页面并确保会话正确关闭,但我不能做那种运动,因为代码已经在生产。所以我试图找到一种方法来获取会话工厂中所有打开的会话,然后使用母版页或使用其他进程关闭它,但我找不到办法。

那么,有没有办法让所有打开的会话?或者可能设置会话空闲超时或其他什么,你有什么建议?谢谢你的建议。

1 个答案:

答案 0 :(得分:1)

据我所知,不支持从会话工厂获取打开的会话列表。我有自己的方法来关注开放会话,我使用这种结构:

创建一个对ISession的弱引用的类。这样,如果会话被垃圾收集,您将不会中断垃圾收集器:

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;
}

这样我维护了一个可以在需要时查询的打开会话列表。也许这符合您的需求?