首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SessionFactory.Evict的副作用?

SessionFactory.Evict的副作用?
EN

Stack Overflow用户
提问于 2013-01-24 21:23:07
回答 1查看 1.1K关注 0票数 1

我经常要对数据库中的一个或多个业务实体进行修改,这些实体可能已经缓存在我们的内部应用程序中。为了让应用程序能够在不循环应用程序池的情况下反映这些变化,我想我应该嵌入开发人员/管理员将缓存从应用程序的UI中删除的能力(不管是完全还是针对特定对象),但是我注意到了方法的注释如下……

代码语言:javascript
复制
/// <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的实现细节,但是我仍然对同时被驱逐的效果感到好奇。

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

EN

回答 1

Stack Overflow用户

发布于 2013-01-25 06:36:19

将实体从会话中逐出。

代码语言:javascript
复制
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不知道我们对这本书做了什么。它可以通过大型应用程序的其他层或层进行传递。我们不知道它与哪个会话相关,如果有的话。我们甚至可能不知道这本书是否存在于数据库中。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14511050

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档