我有一个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