【问题标题】:NHibernate not finding named query result sets in 2nd level cacheNHibernate 在二级缓存中找不到命名查询结果集
【发布时间】:2011-02-15 13:10:09
【问题描述】:

我有一个简单的单元测试,我使用相同的参数执行相同的 NHibernate 命名查询 2 次(每次不同的会话)。这是一个简单的 int 参数,由于我的查询是命名查询,我假设这两个调用是相同的,结果应该被缓存。

事实上,我可以在我的日志中看到结果正在被缓存,但使用不同的键。所以,我的第二个查询结果永远不会在缓存中找到。

这是我日志中的一个片段(注意键的不同之处):

(第一次查询)

调试 NHibernate.Caches.SysCache2.SysCacheRegion [(null)] - 添加新数据:key= [snipped]... 参数:['809'];命名为 参数:{}@743460424 & value=System.Collections.Generic.List`1[System.Object]

(第二次查询)

调试 NHibernate.Caches.SysCache2.SysCacheRegion [(null)] - 添加新数据:key=[snipped]... 参数:['809'];命名为 参数:{}@704749285 & value=System.Collections.Generic.List`1[System.Object]

我已将 NHibernate 设置为使用查询缓存。我将这些查询设置为 cacheable=true。不知道还能去哪里看。有人有什么建议吗?

谢谢
-迈克

【问题讨论】:

    标签: nhibernate second-level-cache


    【解决方案1】:

    好的 - 我想通了。我正在使用以下语法执行我的命名查询:

    IQuery q = session.GetNamedQuery("MyQuery")
                    .SetResultTransformer(Transformers.AliasToBean(typeof(MyDTO)))
                    .SetCacheable(true)
                    .SetCacheRegion("MyCacheRegion");
    

    (我可以补充一下,EXACTLY NHibernate 文档如何告诉你如何做到这一点.. 但我离题了 ;))

    如果您为每个查询创建一个新的 AliasToBean 转换器,那么每个查询对象(这是缓存的键)将是唯一的,您将永远不会获得缓存命中。所以,简而言之,如果你像 nhib 文档所说的那样做,那么缓存将不起作用。

    相反,在静态成员 var 中创建一次转换器,然后将其用于查询,缓存将起作用 - 如下所示:

    private static IResultTransformer myTransformer = Transformers.AliasToBean(typeof(MyDTO))
    

    ...

    IQuery q = session.GetNamedQuery("MyQuery")
                        .SetResultTransformer(myTransformer)
                        .SetCacheable(true)
                        .SetCacheRegion("MyCacheRegion");
    

    【讨论】:

    • 文档在缓存上下文中没有提及转换器。这种行为是有道理的。
    • 只有在您研究日志并查看发生了什么之后才有意义。 :)
    • 不错,我自己也遇到过这个问题,我想我肯定做错了什么。
    猜你喜欢
    • 1970-01-01
    • 2017-08-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-07
    • 1970-01-01
    • 1970-01-01
    • 2011-01-14
    相关资源
    最近更新 更多