1

每隔一段时间,我的任务就是对数据库中可能已经缓存在内部应用程序中的一个或多个业务实体进行更改。为了让应用程序在不循环应用程序池的情况下反映这些更改,我想我应该嵌入开发/管理员从应用程序 UI 中逐出缓存的功能(完全或某些对象),但我注意到了该方法说明以下...

/// <summary>
/// Evict an entry from the process-level cache.  This method occurs outside
///     of any transaction; it performs an immediate "hard" remove, so does not respect
///     any transaction isolation semantics of the usage strategy.  Use with care.
/// </summary>
void ISessionFactory.Evict(Type persistentClass, object id);

这到底是什么意思呢?如果我试图驱逐一个或多个交易中可能涉及的对象,可能会出现什么问题,如果它们具有破坏性,是否有办法避免这些副作用?我目前正在使用 SysCache2 并正在寻找有关如何使用 SqlDependency 的实现细节,但同时我仍然对 Evict 效果感到好奇。

更新:仔细查看评论后,似乎从进程级缓存中删除,并SessionFactory.Evict()从二级缓存中删除。然而,这两种口味都存在相同的免责声明。所以我原来的问题仍然存在。如果实体当前正在另一个事务中使用,那么从缓存(进程或二级)中逐出实体有什么危险?SessionFactory.EvictCollection()SessionFactory.EvictEntity()

4

1 回答 1

0

Evict 将实体从会话中分离出来。

private static Book CreateAndSaveBook(ISessionFactory sessionFactory)
{
    var book = new Book()
    {
        Name = "Book1",
    };

  using (var session = sessionFactory.OpenSession())
  {
    using (var tx = session.BeginTransaction())
    {
         session.Save(book);
         tx.Commit();
         session.Evict(book);
    }
  }
 return book;
}

在 CreateAndSaveBook 中,我们创建一本书并将其保存到数据库中。我们提交我们的事务,从会话中驱逐这本书,关闭会话,然后返回这本书。这设置了我们的问题。我们现在有一个没有会话的实体。不会跟踪对此实体的更改。它只是一个普通的书籍对象。

我们继续更改 book 对象,现在我们要保存这些更改。NHibernate 不知道我们对这本书做了什么。它可能已经通过大型应用程序的其他层或层。我们不知道它与哪个会话相关联,如果有的话。我们甚至可能不知道这本书是否存在于数据库中。

于 2013-01-25T06:36:19.467 回答