如何保持长时间运行的NHibernate Session数据一致?

时间:2010-09-20 19:02:50

标签: c# asp.net nhibernate caching consistency

我在ASP.NET会话中缓存了NHibernate会话。

我遇到过这样一种情况:用户编辑了一个对象,因此它位于ISession的第一级缓存中。然后另一个用户编辑了同一个对象。

此时,User1仍会看到其原始版本的编辑,而User2会看到对象的正确状态?

如果没有手动为每个单独的对象手动调用session.Refresh(myObj)来处理这个问题的正确方法是什么?

我还启用了二级缓存。对于NHibernate Long Session,我应该完全禁用第一级缓存吗?

编辑:在10.4.1. Long session with automatic versioning中添加更多术语到本节末尾的内容

  

由于ISession也是(强制性)第一级缓存并包含所有已加载的对象,因此我们可以将此策略仅用于少数请求/响应周期。这确实是推荐的,因为ISession很快也会有过时的数据。

我不确定这是什么类型的文档,它可能包括两者,然后立即说会话将有陈旧的数据(这是我所看到的)。这个问题的解决方案是什么,或者没有?

3 个答案:

答案 0 :(得分:3)

答案 1 :(得分:3)

只使用IStatelessSession而不是ISession。

还要记住,NH并非设计用于长期存在的ISessions(如其他人已经提到的)。一个问题是你已经提到过了。另一个是当NH跟踪大型对象图时性能显着下降。使用IStatelesSession可以避免这两个问题。 它为您提供不被NH跟踪的分离对象。

不确定在ASP.NET会话中保留会话的原因。也许你可以提供一些细节?

还要记住,会话是IDbConnection的包装器。保持开放很容易导致连接池饥饿。

答案 2 :(得分:0)

显然这是NHibernate的一个众所周知的缺点,详见我的问题中引用的文档。