对于长期Web请求,NHibernate的“每个请求一个会话”模式是不是有点危险?

时间:2010-09-01 19:04:35

标签: .net nhibernate transactions

在我工作的公司中,我们使用的是NHibernate会话包装器,它在同一请求结束时处理当前Web请求中打开的所有会话,并提交所有相关的事务(我们正在多数据库环境,我们为每个数据库创建一个会话。)

此外,在我们正在使用的会话包装器中,会话和事务是耦合的,我们不能在不释放其会话的情况下提交事务。

问题在于,有时候,一个事务在所有请求生命周期内保持打开状态,并且数据库表会在很长时间内保持锁定状态。

......我们错过了什么吗?

2 个答案:

答案 0 :(得分:2)

每个请求的会话只是进行会话生命周期管理的一种方式。它恰好是Web应用程序的推荐策略,但NHibernate对您管理会话生命周期的方式实在无动于衷。

您当然可以使用比单个请求更短或更长的会话。如果你的用例会以这种方式更好地工作,那就去吧。

不要让你的会话包装器对你的NHibernate适应应用程序需求的能力施加不必要的限制。

答案 1 :(得分:2)

听起来更像是您正在使用的会话管理器的限制。当然,所有打开的事务都应该在会话结束时处理(如果没有提交则回滚) - 您应该能够根据需要创建和提交事务。它实际上取决于您希望如何处理服务调用 - 如果您希望它将服务调用视为一个原子事务,我认为您将一直处于锁定状态直到完成。很多选择在这里。