2010-09-20 91 views
3

我有NHibernate会话缓存在ASP.NET会话中。如何保持长时间运行NHibernate会话数据一致?

我遇到过一种情况,用户编辑一个对象,以便它在ISession的第一级缓存中。另一个用户然后编辑同一个对象。

在这一点上,用户1仍然看到他们的编辑的原始版本,因为用户2看到对象的正确状态?

什么是无需手动调用session.Refresh(myObj)显式地为每个单个对象处理此问题的正确方法?

我也有第二级缓存启用。对于NHibernate长期会话,我应该只是完全禁用第一级缓存?

编辑:添加一些术语,我正在寻找从10.4.1. Long session with automatic versioning本节结束的结论与

由于ISession的实现也是(强制性的)第一级缓存,包含所有加载的对象,我们可以只使用这种策略仅用于一些请求/响应周期。这确实是建议的,因为ISession很快也会有过时的数据。

我不知道这是什么样的文件,它包括可能然后立即说会话将有陈旧的数据(这是我所看到的)。这里有什么解决方案或者没有?

+0

正确的方法是不使用长时间运行的会话。你为什么这样做? – Paco 2010-09-20 19:11:27

+0

这是一个不准确的陈述。长时间运行的会话是完全有效的会话管理模式。不幸的是,它似乎比每个请求的会话复杂得多。 – 2010-09-20 19:14:32

+0

Paco是对的,你没有得到什么ISession用于 – 2010-09-20 19:15:14

回答

0

显然这是NHibernate的一个已知的缺点,详细的由我的问题中引用的文档。

3

只需使用IStatelessSession而不是ISession。

另外请记住,NH的设计不适用于长期存在的ISessions(正如其他人已经提到的那样)。一个问题是你已经提到过。另一个原因是,当有NH跟踪的大对象图时,性能显着下降。这两个问题都可以通过使用IStatelesSession来避免。 它给你不被NH跟踪的分离对象。

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

还要记住,会话是IDbConnection的一个包装。保持开放很容易导致连接池不足。

+0

IStateless是否使用二级缓存?我似乎无法从谷歌找到任何明确的答案。 – 2010-09-20 19:36:49

+0

但是,如果我使用无状态,甚至根本无法管理会话。 – 2010-09-20 19:38:31

+0

无状态会话不与任何二级缓存交互。 – 2010-09-20 19:50:06