gpt4 book ai didi

c# - Hibernate OpenSession() 与 GetCurrentSession()

转载 作者:行者123 更新时间:2023-11-29 01:38:45 25 4
gpt4 key购买 nike

我是 N hibernate 的新手。我在我的应用程序中使用 n hibernate 。我编写的代码运行成功但有点慢,因为当我检查 hibernate 分析器时,它向我展示了进程缓慢的一些原因。“每个请求超过一个 session ”我的代码是

          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() 函数时,它返回一些异常

No CurrentSessionContext configured (set the property current_session_context_class)!

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

"property name="current_session_context_class">thread_static /property>"

它显示不同的异常是

no session bound to the current context

我过去 3 天都在处理它,但找不到任何解决方案,请帮助我,我很担心。

最佳答案

CurrentSessionContext 只告诉 NHibernate 它应该使用哪个 session 上下文的实现。根据您正在编写的应用程序类型,有多个可用。配置完成后,您需要将创建的每个 session 对象绑定(bind)到 session 上下文。下面的代码解释了如何做到这一点

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);
}
}

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

  1. 检查是否存在绑定(bind)到上下文的现有 session 对象,如果是,则从 session 工厂返回当前 session ,因为这是绑定(bind)到上下文的对象
  2. 如果没有,则打开一个新 session ,将其绑定(bind)到CurrentSessionContext并返回 session 对象

请注意,SessionManager 上有一个Unbind 方法,您可以使用它来取消绑定(bind) session 对象。

现在,关于警告 more more than one session per request。此警告清楚地告诉您每个请求使用多个 session (如果您在 Web 应用程序的上下文中使用它)。应对此警告的一种流行方法是使用“Session per request”模式。在这种模式中,对于每个传入的请求,您都会在请求到达您的代码时创建一个新的 session 对象,在整个请求处理过程中使用该 session 对象,并在请求离开您的代码时释放该 session 对象。可以将以下代码添加到 ASP.NET MVC 应用程序的 global.asax.cs 文件中以获取“每个请求的 session ”

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();
}
}

关于c# - Hibernate OpenSession() 与 GetCurrentSession(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32092986/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com