NHibernate在二级缓存中找不到命名查询结果集

时间:2010-05-04 15:56:16

标签: nhibernate second-level-cache

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

事实上,我可以在我的日志中看到结果是缓存的,但键有不同。因此,我的第二个查询结果永远不会在缓存中找到。

这是我的日志中的剪辑(注意密钥是如何不同的):

(第一次查询)

  

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

(第二次查询)

  

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

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

感谢
-Mike

1 个答案:

答案 0 :(得分:2)

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

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

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

如果您为每个查询使用创建新的AliasToBean Transformer,那么每个查询对象(,它是缓存的关键)将是唯一的,您将永远不会获得缓存命中。所以,简而言之,如果你像nhib docs那样说,那么缓存就不会起作用。

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

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

...

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