【问题标题】:NHibernate 4: Second Level Cache use for lazy load child collectionsNHibernate 4:二级缓存用于延迟加载子集合
【发布时间】:2015-02-15 21:47:54
【问题描述】:

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

以下行为似乎发生了变化(如果我错了,请纠正我):

  • 使用二级缓存时不再需要事务
  • 当我执行 (Hibsession.Query().Where(x => x.Name == "x").ToList()) 之类的查询时,它将查询整个实体。在 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,然后让二级缓存实现实体)

提前致谢

【问题讨论】:

    标签: nhibernate second-level-cache


    【解决方案1】:

    仍然需要交易。一旦你开始更新一些缓存的实体,如果不使用它们就会禁用缓存。 (See here as for why,我最近被最新的 NH 版本咬了。为什么我忽略了事务?没有借口...此外,在 SQL Server 中启用了read committed snapshot,这消除了涉及只读已提交查询的死锁。)

    集合缓存有效,但必须在集合映射中配置。将&lt;cache usage="..." /&gt; 节点添加到您的集合和其他需要缓存的集合中。它们包含的实体也必须是可缓存的,这样才能真正有用。 (集合缓存只缓存相关实体的主键。)

    在您的查询机制上,如果查询是可缓存的,则仅从 DB 加载 id,尽管我是 NHibernate 的长期用户,但我从未见过这种情况。 (我是从0.9版本开始用的,已经很成熟了,功能也很丰富。)据我所知,NH 4的二级缓存并没有什么大的变化,你可以查看他们的issues and changes tracker

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-01-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-07
      • 1970-01-01
      相关资源
      最近更新 更多