问题标签 [session-per-request]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
369 浏览

nhibernate - Monorail、nhibernate 和 session-per-request 模式

我需要一些关于我即将对我们的网络应用程序进行重构的见解和想法。

我们最初通过使用 HttpApplication 中的 On_BeginRequest / On_EndRequest 来使用 NHibernate 和 ActiveRecord 的 session-per-request 模式来创建和处置会话。后来,我们意识到任何与 DB 相关的异常都被抛出了我们的 monorail-context,这意味着我们的救援没有开始。作为另一个副作用,我们没有选择完全跳过任何 NHibernate 会话的创建行动,这在某些情况下是可取的。

所以我们重写它以在我们的基本控制器的 Initialize() / Contextualize() 中创建会话,并将它们放置在我们的基本控制器的 Dispose() 中。我们还在救援控制器中回滚会话,以防止对数据库进行任何一半的写入更改。到目前为止,一切都很好。在 Dispose() 中这样做的原因是因为我们希望它能够通过视图渲染,因为延迟加载的原因以及需要获取会话的视图组件(我们可以切换到工作单元viewcomponents,但它们似乎没有 Dispose()...)

但是,我遇到了一些死锁问题,我们在数据库中开始了没有回滚或提交的事务,我无法理解它,主要是因为我们用这种方法弄得一团糟。 .

所以我找到了这篇文章:http ://hackingon.net/post/NHibernate-Session-Per-Request-with-ASPNET-MVC.aspx

我想,“过滤器,我们也可以在 MonoRail 中使用它!”,因为它可以在 BeforeAction 和 AfterRendering 中发挥作用。

那么我的问题是:

  1. 如果过滤器中出现异常会发生什么?
  2. 即使在动作或渲染中发生异常,AfterRendering 也会触发吗?
  3. 您会推荐这种方法吗?如果没有,您的建议是什么?

任何指针都非常感谢!

0 投票
3 回答
3495 浏览

wcf - WCF、NHibernate 和 Ninject 的每请求会话实现

我正在尝试在我的 WCF 应用程序中实现每请求会话模型,并且我已经阅读了无数关于此主题的文档,但似乎没有完整的演示。我实际上遇到了一些非常有用的文章,例如:

NHibernate 的 ISession,作用于单个 WCF 调用

但这些都是从过去 NHibernate 和 Ninject 没有 WCF 特定实现的时候开始的,因此他们通过实现他们的自定义服务提供程序等实现了我所需要的。由于 Ninject 和 NHibernate 现在都支持 WCF,我想保持一致通过使用他们的模块,但我最终来到了这里......

基本设置和流程应该是这样的:

  1. 在休眠配置中将 CurrentSessionContext 设置为 WcfOperationSessionContext
  2. 在服务启动、开始请求或初始化时间附近的任何地方,打开会话并将其绑定到当前上下文
  3. 存储库使用 SessionFactory.GetCurrentSession() 方法获取当前会话实例
  4. 在生命周期结束时解除绑定和关闭会话

我最初的问题是我无法访问 wcf 生命周期来处理我的绑定。在深入研究了ninject代码之后,我设法将我的方法与ServiceHost的Opening / Closing事件挂钩,而没有进行太多更改,但是由于它是线程静态的,所以我无法访问OperationContext。

后来我尝试启用 asp.net 兼容性并使用 Application_BeginRequest 和 Application_EndRequest,它看起来很有希望,但我认为这不是最好的解决方案,因为我应该将内容绑定到服务实例,而不是 http 请求。

有没有人使用 ninject 的内置 wcf 扩展库来实现这一点?或者关于我可能做错了什么的任何想法?

0 投票
2 回答
1222 浏览

java - 每个请求的休眠和 JSP 事务

嘿,我正在构建一个四层软件系统(演示 - JSP、问题域、应用程序逻辑、持久性),我希望每个请求都让我的事务处于休眠状态,这样我就不会在每次我想做某事时都进行事务而且我可以对我的对象进行数据跟踪,以便只更新已更改的属性。

我已经将 spring 视为一个框架,尽管我很想实现它,但我的团队已经否决了它,我们不能使用它。

我还查看了 JTA,但由于我没有使用 bean,所以我看不出它会有什么用处。

我已经考虑过一种解决方案,例如有一种方法来调用关闭和打开事务,但似乎可能有一个更优雅的解决方案。

根据我的系统,按请求保留交易的最佳方式是什么?

0 投票
1 回答
3752 浏览

asp.net-mvc - 尝试根据 Web 请求实现会话,没有配置当前会话上下文

正如我在标题中所说,我想为每个 Web 请求实现会话。我的会话提供程序是这样配置的(我对更改此配置不感兴趣。)

在 Global.asax.cs 中,我有以下与每个 web req 的会话相关的代码。

在调试我的 webapp 时出现错误:没有配置当前会话上下文。 ErrorMessage 引用 global.asax 行 CurrentSessionContext.Bind(session);

更新已 添加.ExposeConfiguration(c => c.SetProperty("current_session_context_class", "web")) ,现在我在从我的控制器中检索数据时收到错误消息,如下所示 错误消息:会话已关闭!对象名称:'ISession'。

控制器代码:

0 投票
2 回答
1513 浏览

asp.net-mvc - 用于使用 NHibernate 在 mvc 中处理每个 Web 请求的会话的推荐模式

例如。我的会话工厂位于 MyDomain.SessionProvider 类中。会话可以打开using ISession session = SessionProvider.Instance.OpenSession()

步骤:SessionProvider.cs

步骤:Global.asax.cs

申请开始

App_BeginRequest

EndRequest 处理会话

Step3.HomeController 我应该使用当前会话

现在,尝试在我的控制器上检索数据,例如 desc。在步骤 3。我收到错误消息,提示我的会话已关闭。我试图删除 global.asax 中的 Application_EndRequest 块,因为我的事务被会话包装但没有成功。还是一样的错误。

第二个/侧面问题:这种模式是否被广泛接受,或者最好将其包装在 mvc 控制器的自定义属性中。谢谢。

更新:在我的控制器上尝试在线实例化当前会话

我收到以下错误:

0 投票
1 回答
1930 浏览

open-session-in-view - 视图模式中每个请求的会话与 Open Sesson 之间的区别

伙计们, Open Session in ViewSession per request模式有什么区别?我正在使用 Spring MVC 和 Hibernate 。我不是在这里谈论事务分界,因为每个请求的 Session 似乎是 1 session:1 tx。但是对于 OSIV,有 1 个会话,然后有多个事务(每个服务调用 1 个)。有人可以对此有所了解吗?

0 投票
2 回答
1552 浏览

c# - 每个请求的 NHibernate 会话/事务防止多次插入

我正在处理的 MVC 3 项目提交/回滚我在当前会话结束时所做的任何插入/更新调用。这在大多数情况下都可以正常工作,除了现在我正在做多个插入。

当 csv 上传到站点时,每条记录都会被解析并插入到数据库中。问题是,如果一条记录插入失败,所有以前的记录都会回滚,并且所有后续尝试都会失败并出现错误:

如何禁用每个会话的请求(或者我是否必须以某种方式“重新启动”事务)?

编辑:详细信息

每个请求的会话内容是在实现 IHttpModule 的类中配置的。此类采用 HttpApplication 上下文和 UnitOfWork 类。这是提交和回滚发生的地方。

上面提到的 UnitOfWork 是使用 StructureMap 注入到存储库中的。

就像我说的,这种行为对于 99% 的站点其余部分来说都很好,我只需要获取此批量更新以忽略每个请求的会话事务。或者我需要为每条新记录手动重新启动事务。我只是不知道怎么做。

0 投票
0 回答
1996 浏览

spring-mvc - OpenSessionInView 工作但不为@Transactional 提供其会话

我正在尝试使用 Spring MVC 3 和 Hibernate 4.1 来获得声明式事务管理,为整个请求长度提供一个开放会话。我只有一个用于数据访问的“管理器”层,它直接使用会话。这是用@Transactional 注释的,并且会话在退出该层时关闭,并且我在控制器中得到一个延迟加载异常。

因此,我添加了 OpenSessionInViewFilter 过滤器,并且日志表明此过滤器已正确配置,并且它们还显示此过滤器正在打开会话。不幸的是,我的管理层仍然像以前一样打开和关闭自己的会话,并且我在控制器中得到了相同的延迟加载异常。

编辑:注意到在我的日志中,我打开了过滤器会话,打开了 HibernateTransactionManager 会话,关闭了 HibernateTransactionManager 会话,延迟加载异常,然后关闭了过滤器会话。所以我知道在延迟加载异常期间某处有一个打开的会话,但是该对象是在与另一个关闭的会话关联的事务中加载的。

我认为从管理器类中删除 @Transactional 会从该层删除会话管理并让过滤器完成它的工作,但是 sessionFactory().getCurrentSession() 只是获得一个关闭的会话;它无权访问过滤器提供的打开会话。

如何访问 OpenSessionInViewFilter 的明确打开的会话?

springapp-servlet.xml

web.xml

休眠上下文.xml

管理器.java

控制器.java

我的异常发生在控制器中,在读取管理器类中加载并传递给该控制器的对象的第一个属性时:

org.springframework.web.util.NestedServletException:请求处理失败;嵌套异常是 org.hibernate.LazyInitializationException: 无法初始化代理 - 没有会话 org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:894) org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java: 778)javax.servlet.http.HttpServlet.service(HttpServlet.java:617)javax.servlet.http.HttpServlet.service(HttpServlet.java:717) java:119) org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76)

我已经研究了好几个小时了..我所能找到的只是使用休眠 3 的解决方案和对休眠 4 会话/事务理论的粗略解释,没有示例。

有什么想法吗?

更新:已修复!

发现这个:

Spring MVC OpenSessionInViewInterceptor 不工作

不幸的是,这并没有帮助那里的 OP,但它帮助了我。值得注意的是,这:

“最好不要在 dispatcher-servlet.xml 中导入 applicationContext.xml,而是使用 ContextLoaderListener 加载它”

其中,应用于我的配置,正是我在上面发布的所有内容,但不是

在我的 springapp-servlet.xml 中,我将 ContextLoaderListener 修改为:

这就是全部

将 OSIV 创建的会话返回给我。而且,事实上,正在创建的第二个会话不再是,因为我发现了这些可爱的小日志行:

这表明,在我的 @Transactional 服务层之外,OSIV 创建的会话还活着并且运行良好,并且只是为它启动了一个新事务。

希望这对其他人有帮助。我什至不想考虑我花了多少时间在这上面工作。

0 投票
1 回答
3778 浏览

c# - NHibernate 中的工作单元和每个请求的会话

我想我的架构中可能有我的工作单元设置错误。这是我目前拥有的(缩进以显示顺序):

在这里,我使用 NHibernate 调用各种服务来执行 crud。当我想对数据库进行更改(更新/保存)时,我调用此代码:

当 HttpRequest 结束时,我执行以下步骤:

我遇到了能够回滚大批量进程的问题。因为我在我的 CRUD 层中提交我的事务,如上所示,我的事务不再处于活动状态,当我尝试在我的 UnitOfWork 中回滚时,它什么也不做,因为事务已经被提交。我在我的 CRUD 层中提交我的代码的原因是我可以尽可能快地保存我的数据,而不会锁定数据库太久。

在上述情况下采取的最佳行动方案是什么?我是否只是进行不提交批处理作业的特殊 CRUD 操作,只是在我的工作结束时处理提交,还是我的逻辑与我的 UnitOfWork 和每个请求的会话有缺陷?有什么建议么?

0 投票
2 回答
2109 浏览

hibernate - 最佳实践 Hibernate 乐观锁定和 Web 应用程序

我有一个用 Tapestry5 (java webframework) 和 Hibernate 制作的 web 应用程序。现在我正在尝试添加乐观锁定。所以我添加了一个版本属性并且乐观锁定工作,所以这很容易和快速。

但是由于我的 Web 应用程序使用“每个请求的会话”模式,我不确定利用这种乐观锁定的最佳方式是什么。

怎么了:

UserA 使用加载了 entityA(版本 1)的值的表单打开页面。

UserB 使用加载了来自 entityA(版本 1)的值的表单打开页面。

UserA 更改一些值并提交表单。-> 新请求检索 entityA(版本 1)并提交更改(entityA 现在是版本 2)

UserB 更改一些值并提交表单。-> 新请求检索 entityA(版本2)并提交更改(entityA 现在是版本 3)

应该发生什么

不应提交 UserB 的更改。但是由于 session-per-request 模式,Hibernate 的乐观锁定错误可能发生的时间窗口减少到仅从提交后的新请求到提交的时间跨度,这不是预期的结果。

可能的解决方案

经过一番研究,我发现了以下内容:

  • 使用实体版本向表单添加隐藏字段

我可以在提交之前使用这个值来设置实体的版本,但是 Hibernate 文档不建议设置这个值。此外,它仅在实体被分离和重新连接时才有效,因为否则 Hibernate 会忽略手动设置的版本值。

其次,我可以使用此版本值进行手动检查,当呈现表单时,版本是否与提交请求中加载的实体版本相同。如果需要,然后自己抛出一个 OptimisticLockingException。

  • 将分离的实体放入 HttpSession 中,因此我不必在提交时再次加载它

结论

这些方法有效,但对我来说似乎不太实用并且容易出错。所以我想知道其他人如何实现这个问题。