【问题标题】:Second level cache does not cache filtered collections in NHibernate?二级缓存不缓存NHibernate中过滤的集合?
【发布时间】:2011-09-07 21:31:44
【问题描述】:

我正在使用 NHibernate 3.0 配置 二级缓存。二级缓存对于实体和集合效果很好,但我也有一些具有过滤集合的实体。

 <bag name="EntityTrans" cascade="all-delete-orphan" table="EntityTrans">
            <key column="entityId" not-null="true" />
            <one-to-many class="MyDomain.EntityTran, MyDomain" />
            <filter name="cultureFilter" condition=":cultureCode = CultureCode" />
        </bag>

NHibernate 2 级缓存不缓存上述过滤集合。我可以在 NProf 中看到过滤集合查询被发送到数据库。我的 NHibernate 配置文件有以下条目。

<class-cache class="MyDomain.EntityTran, MuDomain" region="MyRegion" usage="read-only"/>
<collection-cache collection="MyDomain.Entity.EntityTrans" region="MyRegion" usage="read-only"/>

是否需要添加更多内容来缓存过滤后的集合?

【问题讨论】:

    标签: asp.net hibernate nhibernate second-level-cache


    【解决方案1】:

    目前 NHibernate 不支持过滤集合的二级缓存。

    首先我发现了这个forum post。然后我查看了代码(CollectionLoadContext.cs ~line 299),发现如下:

    if (!(session.EnabledFilters.Count == 0) && persister.IsAffectedByEnabledFilters(session))
    {
        // some filters affecting the collection are enabled on the session, so do not do the put into the cache.
        log.Debug("Refusing to add to cache due to enabled filters");
        // todo : add the notion of enabled filters to the CacheKey to differentiate filtered collections from non-filtered;
        //      but CacheKey is currently used for both collections and entities; would ideally need to define two separate ones;
        //      currently this works in conjunction with the check on
        //      DefaultInitializeCollectionEventHandler.initializeCollectionFromCache() (which makes sure to not read from
        //      cache with enabled filters).
        return; // EARLY EXIT!!!!!
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-10-18
      • 2011-09-02
      • 1970-01-01
      • 2014-06-20
      • 2017-08-17
      • 1970-01-01
      • 2013-12-20
      相关资源
      最近更新 更多