我经常要对数据库中的一个或多个业务实体进行修改,这些实体可能已经缓存在我们的内部应用程序中。为了让应用程序能够在不循环应用程序池的情况下反映这些变化,我想我应该嵌入开发人员/管理员将缓存从应用程序的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的实现细节,但是我仍然对同时被驱逐的效果感到好奇。
更新:在仔细查看注释时,SessionFactory.Evict()和SessionFactory.EvictCollection()似乎从进程级缓存中删除,而SessionFactory.EvictEntity()从第二级缓存中删除。然而,同样的免责声明存在于这两种口味上。所以我原来的问题仍然存在。如果实体目前正在另一个事务中使用,那么将其从缓存(进程或二级)中逐出有什么危险?
发布于 2013-01-25 06:36:19
将实体从会话中逐出。
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不知道我们对这本书做了什么。它可以通过大型应用程序的其他层或层进行传递。我们不知道它与哪个会话相关,如果有的话。我们甚至可能不知道这本书是否存在于数据库中。
https://stackoverflow.com/questions/14511050
复制相似问题