【问题标题】:NHibernate: Get all opened sessionsNHibernate:获取所有打开的会话
【发布时间】:2011-12-12 16:10:11
【问题描述】:

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

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

【问题讨论】:

  • 您的会话是如何管理的? (根据请求等...)
  • 你可以写一个会话工厂的包装器,但是你怎么知道哪个会话可以关闭呢?也许“最好的解决方案”是唯一的解决方案。
  • 感谢 Alex 和 GertArnold,会话是根据每个页面中的请求进行管理的,因此如果我们获得一些客户端详细信息,例如打开一个会话然后关闭(假设是关闭但在某些情况下它没有)。

标签: asp.net nhibernate session sessionfactory


【解决方案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;
}

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

【讨论】:

  • 另一种方式可能是通过 NHibernate 统计信息,但您需要先启用它。如果你想知道怎么做,请告诉我,因为我喜欢我自己的实现。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-14
  • 1970-01-01
  • 1970-01-01
  • 2022-09-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多