2010-06-08 31 views
0

我有一个运行Burrow的网站,我也希望将它用于Quartz作业。在使用NHibernate Burrow的Asp.Net MVC环境中使用Quartz

事情是我希望他们不要分享任何状态。 Quartz作业在每个线程中运行,而Mvc框架在每个请求结束时关闭Workspace。 理想情况下,mvc应该有自己的会话,每个工作都应该有自己的会话。

这里有什么可能吗? PS:我很新的Quartz,Burrow和MVC顺便说一句,所以我可能错过了一些非常基本的知识:

+0

我发现ThreadStaticSessionContext在NHibernate的,但这似乎只支持一个SessionFactory的(有计划的升级迫使我用几个这是我开始与洞穴摆在首位的原因之一) 另一个问题是如何让Burrow使用这个和web上下文.. – simendsjo 2010-06-08 12:01:46

回答

0

我尝试了一种简单朴素的方式,至少似乎现在工作。我在这里做了什么根本错误?当线程退出时,这些变量是否会被垃圾收集?

public static class SessionManager 
{ 
    [ThreadStatic] 
    private static IDictionary<ISessionFactory, ISession> _sessions; 

    public static ISession GetSession(Type type) 
    { 
     var burrow = new BurrowFramework(); 

     if (burrow.WorkSpaceIsReady) 
     { 
      return burrow.GetSession(type); 
     } 
     else 
     { 
      if (_sessions == null) 
      { 
       _sessions = new Dictionary<ISessionFactory, ISession>(); 
      } 

      var factory = burrow.GetSessionFactory(type); 
      if (!_sessions.ContainsKey(factory)) 
      { 
       _sessions[factory] = null; 
      } 

      var session = _sessions[factory]; 
      if (session == null || !session.IsOpen) 
      { 
       session = _sessions[factory] = factory.OpenSession(); 
      } 

      return session; 
     } 
    } 
} 
相关问题