我有一个带有 NHibernate 的 ASP.NET 应用程序,由于某种原因,很少有开发人员忘记关闭某些页面中的会话(我认为是 20 个),我知道最好的解决方案是浏览每个页面并确保会话正确关闭,但我不能做那种动作,因为代码已经在生产中了。所以我试图找到一种方法来获取会话工厂中所有打开的会话,然后使用母版页或使用其他进程将其关闭,但我找不到这样做的方法。
那么,有没有办法获得所有打开的会话?或者可能设置会话空闲超时或其他东西,你有什么建议?谢谢指教。
我有一个带有 NHibernate 的 ASP.NET 应用程序,由于某种原因,很少有开发人员忘记关闭某些页面中的会话(我认为是 20 个),我知道最好的解决方案是浏览每个页面并确保会话正确关闭,但我不能做那种动作,因为代码已经在生产中了。所以我试图找到一种方法来获取会话工厂中所有打开的会话,然后使用母版页或使用其他进程将其关闭,但我找不到这样做的方法。
那么,有没有办法获得所有打开的会话?或者可能设置会话空闲超时或其他东西,你有什么建议?谢谢指教。
据我所知,不支持从会话工厂获取打开的会话列表。我有自己的方法来关注开放会话,我使用这种结构:
创建一个对 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;
}
通过这种方式,我维护了一个开放会话列表,我可以在需要时进行查询。也许这可以满足您的需求?