【问题标题】:Remove deleted items from first level cache in NHibernate? Or: how to check if cached items have been deleted?从NHibernate的一级缓存中删除已删除的项目?或者:如何检查缓存的项目是否已被删除?
【发布时间】:2012-07-24 08:04:48
【问题描述】:

我们有一个棕地多用户应用程序(99% 的 Delphi,1% 的 .net),它使用 NHibernate 来实现 .net 模块的持久性。在我的应用程序中,我可以向某个实体添加类别。如果我选择一个并决定不使用它(从而再次删除类别),我已被 NHibernate 加载,并将留在会话的第一级缓存中。现在,如果其他用户删除此类别并且我尝试保存我的实体,我的应用程序将引发异常,因为加载的对象不再存在。

我的问题:有没有办法检查我的缓存是否加载了不再存在的项目?如果是这样,有没有办法从我的缓存中删除不存在的实体?

那么会发生什么: 我加载一个实体(添加到会话缓存) 我添加一个类别(添加到会话缓存) 其他人从数据库中删除了该类别。 我保存了我的实体,但由于该类别不再存在而发生异常。

它仍在会话缓存中。如果我可以(自动)从我的会话缓存中删除它会很好吗?有没有办法清理缓存并删除不再存在的对象?

问候,泰德

【问题讨论】:

    标签: nhibernate concurrency multi-user first-level-cache


    【解决方案1】:

    在 NHibernate 中没有自动执行此操作的选项,至少在 ISession 中没有。您可以使用IStatelessSession 进行加载,因为它没有一级缓存,但您会丢失ISession 提供的许多other features

    您也可以调用ISession.Clear() 来清除会话(一级)缓存,或调用ISession.Evict() 从会话中驱逐某些实体,但这不是自动的。

    您将会话对象保留多长时间?也许您需要不同的会话管理context

    如果会话的生命周期较短,您仍然可以实现实体缓存,但使用second-level cacheSysCache2 是支持SqlCacheDependencysecond-level cache providers 之一。这意味着当数据库中的某些对象发生变化时,您可以设置缓存过期。

    【讨论】:

      猜你喜欢
      • 2019-05-27
      • 1970-01-01
      • 2019-11-20
      • 2023-01-09
      • 2010-10-17
      • 1970-01-01
      • 1970-01-01
      • 2010-10-16
      • 2019-05-02
      相关资源
      最近更新 更多