SessionFactory.Evict的副作用?

时间:2013-01-24 21:23:07

标签: asp.net asp.net-mvc nhibernate caching syscache2

我经常负责对数据库中的一个或多个业务实体进行更改,这些业务实体可能已经缓存在我们的内部应用程序中。为了让应用程序能够反映这些更改而不循环使用应用程序池,我认为我已经将dev /管理员的能力嵌入到应用程序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()从第二个删除级别缓存。然而,两种风味都存在相同的免责声明。所以我原来的问题仍然存在。如果某个实体当前正在另一个交易中使用,那么将该实体从缓存(流程或第二级)驱逐出来会有什么危险?

1 个答案:

答案 0 :(得分: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中,我们创建一本书并将其保存到数据库中。我们承诺 交易,从会话中逐出书籍,关闭会话,并返回书籍。这就解决了我们的问题。我们现在有一个没有会话的实体。未跟踪对此实体的更改。这只是一个普通的普通书籍对象。

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