我有一个简单的单元测试,我使用相同的参数执行相同的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
答案 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");