Hibernate OpenSession()与GetCurrentSession()

时间:2015-08-19 10:31:25

标签: c# mysql .net hibernate nhibernate

我是N hibernate的新手。我在我的应用程序中使用n hibernate。我编写的代码运行成功但速度很慢,因为当我检查了hibernate profiler时,它向我展示了进程缓慢的原因。“每个请求多个会话”我的代码是

          using (ISession session = NContext._mSessionFactory.OpenSession())
          {
              ICriteria criteriaAspNetUser = session.CreateCriteria(typeof(AspNetUsers));
              criteriaAspNetUser.Add(NHibernate.Criterion.Restrictions.Eq("Email", email));
              criteriaAspNetUser.Add(NHibernate.Criterion.Restrictions.Eq("PasswordHash", password)); 

当我使用GetCurrentSession()函数时,它会返回一些异常

  

没有配置CurrentSessionContext(设置属性current_session_context_class)!

但是当我在配置文件中添加以下代码时

  

“property name =”current_session_context_class“> thread_static / property>”

显示不同的异常

  

没有绑定到当前上下文的会话

我正在处理它最近3天但是找不到任何解决方案请帮助我我很担心。

1 个答案:

答案 0 :(得分:3)

CurrentSessionContext只告诉NHibernate它应该使用哪个会话上下文实现。根据您正在编写的应用程序类型,有多种可用。配置完成后,您需要将创建的每个会话对象绑定到会话上下文。以下代码解释了如何执行此操作

public class SessionManager
{
    private static readonly ISessionFactory sessionFactory;

    static SessionManager()
    {
        sessionFactory = new DatabaseConfiguration().BuildSessionFactory();
    }

    public static ISession GetCurrentSession()
    {
        if (CurrentSessionContext.HasBind(sessionFactory))
        {
            return sessionFactory.GetCurrentSession();
        }

        var session = sessionFactory.OpenSession();
        CurrentSessionContext.Bind(session);
        return session;
    }

    public static void Unbind()
    {
        CurrentSessionContext.Unbind(sessionFactory);
    }
}

现在,只要您需要会话对象,就可以调用SessionManager.GetCurrentSession并在内部执行以下操作

  1. 检查是否存在绑定到上下文的现有会话对象,如果是,则从会话工厂返回当前会话,因为这是绑定到上下文的会话
  2. 如果没有,则打开一个新会话,将其绑定到CurrentSessionContext并返回会话对象
  3. 请注意,Unbind上有一个SessionManager方法可用于取消绑定会话对象。

    现在,关于警告more than one session per request。此警告清楚地告诉您每个请求使用多个会话(如果您在Web应用程序的上下文中使用它)。解决此警告的一种流行方法是根据请求使用"会话"图案。在此模式中,对于每个传入请求,您将在请求命中代码时创建新的会话对象,在请求处理过程中使用该会话对象,并在请求离开代码时处置会话对象。可以将以下代码添加到ASP.NET MVC应用程序的global.asax.cs文件中,以获得每个请求的"会话"

    public class MvcApplication : HttpApplication
    {
        protected void Application_Start()
        {
            AreaRegistration.RegisterAllAreas();
            FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
            RouteConfig.RegisterRoutes(RouteTable.Routes);
            BundleConfig.RegisterBundles(BundleTable.Bundles);
        }
    
        protected void Application_BeginRequest(object sender, EventArgs e)
        {
            var session = SessionManager.GetCurrentSession();
        }
    
        protected void Application_EndRequest(object sender, EventArgs e)
        {
            var session = SessionManager.GetCurrentSession();
            session.Close();
            session.Dispose();
        }
    }