NHibernate 4:二级缓存用于延迟加载子集合

时间:2014-12-17 10:58:54

标签: nhibernate second-level-cache

我们在asp.net mvc 4(.net 4)应用程序中使用NHibernate 4。据我所知,NHibernate 4的行为在二级缓存方面有所改变。

以下行为似乎已经改变(如果我错了请纠正我):

  • 使用二级缓存时不再需要事务
  • 当我执行类似(Hibsession.Query()。Where(x => x.Name ==“x”)。ToList())的查询时,它将查询entiry实体。在早期版本的NHibernate中 - 如果我记得正确 - 只会检索实体的id。

在我看来,第二级仅适用于以下情况:

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 (!!)
}

我现在的问题是:

  • 描述了NHibernate 4二级缓存的行为(或至少记录了版本3的更改)
  • 是否可以使用二级缓存来延迟加载子元素? (或者至少确保只加载了id,然后让第二级缓存实现实体)

提前致谢

1 个答案:

答案 0 :(得分:0)

仍需要交易。一旦开始更新某些缓存实体,未能使用它们将禁用缓存。 (See here as for why,我最近被最新的NH版本咬了。为什么我忽略了交易?没有借口......在SQL Server中启用了更多read committed snapshot,这消除了涉及只读读取提交查询的死锁。 )

集合缓存有效,但必须在集合映射中配置。将<cache usage="..." />节点添加到您的集和需要缓存的其他集合中。它们包含的实体也必须是可缓存的,因为它实际上是有用的。 (集合缓存仅缓存相关实体主键。)

在你的查询机制中,如果查询是可缓存的,只从DB加载id,我从未目睹过,尽管我是NHibernate的长期用户。 (我从0.9版本开始使用它,它已经非常成熟并且功能丰富。)据我所知,NH 4的二级缓存没有任何重大变化。你可以查看他们{{3} }。