我们在asp.net mvc 4(.net 4)应用程序中使用NHibernate 4。据我所知,NHibernate 4的行为在二级缓存方面有所改变。
以下行为似乎已经改变(如果我错了请纠正我):
在我看来,第二级仅适用于以下情况:
using (var hibSession = SessionFactory.OpenSession())
{
// Second level cache working
var entity = hibSession.Get<ChachedEntity>(7); // second level cache working
var parent = entity.ParentElement; // second level cache working because n:1
// Probably working (not tested)
var elements = hibSession.Query<ChachedEntity>().Cacheable().Take(30).ToList(); // guessed behaviour: query-cache selects id's and then then uses second level cache
// second level cache NOT Working
var children = entity.ChildCollectionWithCachableEntities; // second level cache NOT working because 1:n (!!)
}
我现在的问题是:
提前致谢
答案 0 :(得分:0)
仍需要交易。一旦开始更新某些缓存实体,未能使用它们将禁用缓存。 (See here as for why,我最近被最新的NH版本咬了。为什么我忽略了交易?没有借口......在SQL Server中启用了更多read committed snapshot
,这消除了涉及只读读取提交查询的死锁。 )
集合缓存有效,但必须在集合映射中配置。将<cache usage="..." />
节点添加到您的集和需要缓存的其他集合中。它们包含的实体也必须是可缓存的,因为它实际上是有用的。 (集合缓存仅缓存相关实体主键。)
在你的查询机制中,如果查询是可缓存的,只从DB加载id,我从未目睹过,尽管我是NHibernate的长期用户。 (我从0.9版本开始使用它,它已经非常成熟并且功能丰富。)据我所知,NH 4的二级缓存没有任何重大变化。你可以查看他们{{3} }。