【问题标题】:NHibernate / Spring.Net / Asp.Net WebForms - Open Transaction Per RequestNHibernate / Spring.Net / Asp.Net WebForms - 每个请求打开事务
【发布时间】:2011-11-09 12:46:51
【问题描述】:

我目前正在使用 NHibernate 和 Spring.Net 并使用 Spring 的 Open Session In View 模块。据我所知,此模块仅在 BeginRequest 上打开会话并在 EndRequest 上关闭它。它实际上并没有在 EndRequest 上提交或刷新会话。

我知道您可以使用 Spring 的 [Transaction] 属性来装饰各个服务方法,这些方法将在方法结束时执行提交,但我不想使用这种技术。

有什么方法可以设置 Spring 的 OSIV 模块,以便在 EndRequest 上刷新会话?如果没有,是否有一种简单的方法来实现我自己的 Open Session In View 来实现这一点?

我已尝试实现 NH 3 Cookbook 中的“每个 Web 请求的会话”示例,但它在 CurrentSessionContext 上引发错误:

    protected void Application_BeginRequest(object sender, EventArgs e)
    {
        var sessionFactory = (ISessionFactory) ContextRegistry.GetContext().GetObject("MySessionFactory");
        var session = sessionFactory.OpenSession(); 
        CurrentSessionContext.Bind(session);
    }

    protected void Application_EndRequest(object sender, EventArgs e)
    {
        var sessionFactory = (ISessionFactory)ContextRegistry.GetContext().GetObject("MySessionFactory");
        var session = CurrentSessionContext.Unbind(sessionFactory);
        session.Dispose();
    }

注意:上面的代码只是试图复制 Spring.Net 目前正在做的事情。我计划在它工作后更新它以刷新会话。

我假设上面的代码不起作用,因为我正在使用 Spring.Net 设置 NH 及其 SessionFactory,这可能会使书中的示例无效。

任何帮助/建议将不胜感激。

我正在使用 NHibernate 3.2 和 Spring 1.3.2

编辑:

阅读http://forum.springsource.org/archive/index.php/t-16949.html 后,我开始怀疑每个请求的事务是否是个好主意。

【问题讨论】:

  • 刷新模式设置为 FlushMode.NEVER 的原因有很多:forum.springframework.net/… 在 OSIV 上设置 FlushMode.NEVER 是设计使然。这是因为如果 OSIV 在“EndRequest”期间刷新挂起的更改并发生错误,则所有响应都已发送到客户端。没有办法告诉客户这个错误。因此可以更改默认的 FlushMode,但我不建议这样做。
  • @Andreas 我现在已经放弃了我最初的想法。我最初的想法背后的主要原因是因为我们有一个现有的 Web 应用程序,它在代码背后有很多业务逻辑。我认为更新 OSIV 以在 EndRequest 上提交会更简单,而不必将代码重构为带有 Transaction 属性的服务方法。但看起来我将不得不在这个问题上硬着头皮。如果您想针对我的建议给出这个建议的答案,那么我很乐意接受。谢谢。

标签: asp.net nhibernate spring.net


【解决方案1】:

我不熟悉 Spring.NET,但是:会话工厂应该只是整个应用程序的一个。详情here。 会话在每个请求开始时打开。

我不知道这在 NH3 中是否发生了变化,但在我们的 NH 2 应用程序中,我们以这种方式构建会话工厂:

NHibernateConfiguration.BuildSessionFactory()

【讨论】:

  • 这真的没有解决我的问题。 Spring.Net 在应用程序启动时构建 SessionFactory。
【解决方案2】:

将刷新模式设置为 FlushMode.NEVER 有一些重要原因:http://forum.springframework.net/showthread.php?3303-OpenSessionInViewModule

Erich Eichinger(SpringSource 有限公司)

在 OSIV 上使用 FlushMode.NEVER 是设计使然。这是因为如果 OSIV 在“EndRequest”期间刷新挂起的更改并发生错误,所有 响应已经发送给客户端。没有办法 告诉客户错误。因此可以改变 默认的 FlushMode 但我不推荐它。

也就是说,有一个未记录的功能。您可以通过在 web.config 中设置 appSettings 键/值对来设置刷新模式:

<configuration>
  <appSettings>
    ...
    <add 
      key="Spring.Data.NHibernate.Support.OpenSessionInViewModule.DefaultFlushMode"
      value="Auto" 
      />
  </appSettings>
  ...
</configuration>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多