我在ASP.NET会话中缓存了NHibernate会话。
我遇到过这样一种情况:用户编辑了一个对象,因此它位于ISession的第一级缓存中。然后另一个用户编辑了同一个对象。
此时,User1仍会看到其原始版本的编辑,而User2会看到对象的正确状态?
如果没有手动为每个单独的对象手动调用session.Refresh(myObj)来处理这个问题的正确方法是什么?
我还启用了二级缓存。对于NHibernate Long Session,我应该完全禁用第一级缓存吗?
编辑:在10.4.1. Long session with automatic versioning中添加更多术语到本节末尾的内容
由于ISession也是(强制性)第一级缓存并包含所有已加载的对象,因此我们可以将此策略仅用于少数请求/响应周期。这确实是推荐的,因为ISession很快也会有过时的数据。
我不确定这是什么类型的文档,它可能包括两者,然后立即说会话将有陈旧的数据(这是我所看到的)。这个问题的解决方案是什么,或者没有?
答案 0 :(得分:3)
答案 1 :(得分:3)
只使用IStatelessSession而不是ISession。
还要记住,NH并非设计用于长期存在的ISessions(如其他人已经提到的)。一个问题是你已经提到过了。另一个是当NH跟踪大型对象图时性能显着下降。使用IStatelesSession可以避免这两个问题。 它为您提供不被NH跟踪的分离对象。
不确定在ASP.NET会话中保留会话的原因。也许你可以提供一些细节?
还要记住,会话是IDbConnection的包装器。保持开放很容易导致连接池饥饿。
答案 2 :(得分:0)
显然这是NHibernate的一个众所周知的缺点,详见我的问题中引用的文档。