在Spring中更改为singleton.NET停止NHibernate中的更新

本文关键字:停止 NHibernate NET 更新 Spring singleton | 更新日期: 2023-09-27 17:50:28

我的web应用程序遇到了一个奇怪的问题。

让我解释一下我的应用程序设置——该应用程序是用IIS 7.x中托管的asp.net mvc 3制作的。我使用Spring。NET用于实例化我的控制器、业务层和存储库。存储库使用NHibernate 3.3。NHibernate会话工厂为每个应用程序创建一次(由Spring.NET控制(。在Global.asax中为每个请求创建一个新会话并将其绑定到上下文(begin request(。会话已从结束请求中的会话上下文解除绑定。显然,有一些检查可以确保这只针对有效的操作方法而不是每个请求进行。

业务层注入了存储库类和围绕NHibernate ISession的自定义包装器。此类中的函数执行必要的DB操作。创建/更新/删除操作始终在NHibernate事务中。在过去的几个月里,这个应用程序运行良好。

在Spring中,我将业务层类标记为singleton=false。NET XML配置。这意味着,对于每个请求,都将创建一个新的控制器实例和一个业务层及其依赖关系的新实例。在进行了一些性能评测之后,我发现就CPU周期而言,这是一个相当昂贵的操作。因此,我将业务层类标记为singleton=true。这降低了通过MVC3 GetService((调用重新创建业务层对象所需的CPU周期。

问题- 在将业务层类更改为singleton之后,不再提交DB更新。Create actions are persisted to the DB. But not updates.我通过NHProfiler查看了NHibernate会话活动,并看到了以下内容:

(对于创建操作(

begin transaction
select * from table_x
insert into table table_y .... 
commit
end transaction

(用于更新操作(

begin transaction
end transaction

就这样,只是一个开始和结束的交易。从不刷新事务的内容。N更新该会话的内存中的抽象实体。ISession。WasCommitted属性返回true。。一切都很好,会话被绑定到该请求的上下文(然后为该请求解除绑定(,其他一切都正常发生。有趣的是,如果有一个插入操作,它会被刷新到DB(但只有插入(。但是,当更新也发生时,该操作不会显示在NHProfiler中。

如果我将该业务层对象的singleton属性(在Spring.NET上下文配置XML中(切换回false,则一切正常。所有CRUD操作都像以前一样继续。

那么,我可能做错了什么?如有任何帮助/建议,我们将不胜感激。

-谢谢!

在Spring中更改为singleton.NET停止NHibernate中的更新

问题出在我自己的代码上。我坚持错了会议。