3

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

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

此时,用户 1 仍然可以看到其编辑的原始版本,而用户 2 可以看到对象的正确状态?

什么是处理这个问题的正确方法,而不是一直为每个对象显式地手动调用 session.Refresh(myObj) ?

我还启用了二级缓存。对于 NHibernate 长会话,我应该完全禁用一级缓存吗?

编辑:为我希望从10.4.1 实现的目标添加更多术语。具有自动版本控制的长会话本节的结尾以

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

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

4

3 回答 3

3
于 2010-09-20T19:18:40.913 回答
3

只需使用 IStatelessSession 而不是 ISession。

另请记住,NH 并非旨在与长寿命的 ISession 一起使用(正如其他人已经提到的那样)。一个问题是你已经提到了。另一个是当有 NH 跟踪的大型对象图时,性能会显着下降。使用 IStatelesSession 可以避免这两个问题。它为您提供未被 NH 跟踪的分离对象。

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

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

于 2010-09-20T19:23:34.820 回答
0

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

于 2011-03-28T14:39:25.390 回答