代码之家  ›  专栏  ›  技术社区  ›  Chris Marisic

如何保持长期运行的nhibernate会话数据一致?

  •  3
  • Chris Marisic  · 技术社区  · 15 年前

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

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

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

    在不手动调用session.refresh(myobj)的情况下,始终为每个对象显式地处理此问题的正确方法是什么?

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

    编辑: 在我希望从中获得的东西中添加更多的术语 10.4.1. Long session with automatic versioning 本节结尾是

    由于isession也是(必需的)一级缓存,并且包含所有加载的对象,因此我们只能在几个请求/响应周期内使用此策略。确实建议这样做,因为ISession很快也会有过时的数据。

    我不确定这对它来说是什么样的文档,可能会同时包含这两种文档,然后立即说会话将包含过时的数据(这就是我看到的)。解决这个问题的方法是什么?还是没有?

    3 回复  |  直到 15 年前
        1
  •  3
  •   Mauricio Scheffer    15 年前
        2
  •  3
  •   Filip Zawada    15 年前

    只需使用IStaTelessSession而不是ISession。

    也要记住,NH并不是设计用于长期使用的ISessions(正如其他人已经提到的那样)。一个问题是你已经提到了。另一个原因是当NH跟踪一个大型对象图时,性能会显著下降。使用IStaTelessesion可以避免这两个问题。 它可以让您分离出NH没有跟踪的对象。

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

    还请记住,会话是IDBConnection的包装器。保持开放很容易导致泳池饥饿。

        3
  •  0
  •   Chris Marisic    15 年前

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

    推荐文章