2011-10-21 88 views
2

我有一个NHibernate的ASP.NET应用程序,由于某些原因,一些开发人员忘记关闭会话在一些页面(如20我认为),我知道最好的解决方案是通过每个页面并确保会话正确关闭,但由于代码已在生产中,因此我无法进行这种移动。所以我试图找到一种方法来获取会话工厂中的所有打开的会话,然后使用母版页或使用额外的进程关闭它,但我找不到这样做的方法。NHibernate:获取所有打开的会话

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

+3

您的会议如何管理? (每个请求等) – AlexCuse

+1

你可以在会话工厂编写一个包装,但是你怎么知道哪个会话可以关闭?也许“最好的解决方案”是唯一的解决方案。 –

+0

感谢Alex和GertArnold,会话是在每个页面的每个请求中进行管理的,所以如果我们得到一些客户端详细信息,例如一个会话被打开然后关闭(当然,它会被关闭,但在某些情况下不会)。 – doc

回答

1

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

创建一个弱引用到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; 
} 

这样我保持打开的会话需要的时候我可以查询的列表。也许这符合你的需求?

+0

另一种方法可能是通过NHibernate统计数据,但您需要先启用它。如果你想知道如何,让我知道,因为我喜欢我自己的实现。 – TedOnTheNet

相关问题