Hok*_*ike 5 nhibernate second-level-cache
我有一个简单的单元测试,我使用相同的参数执行相同的 NHibernate 命名查询 2 次(每次不同的会话)。这是一个简单的 int 参数,由于我的查询是一个命名查询,我假设这两个调用是相同的,并且结果应该被缓存。
事实上,我可以在日志中看到结果正在被缓存,但使用不同的键。因此,我的第二次查询结果在缓存中从未找到。
这是我的日志中的一个片段(请注意密钥有何不同):
(第一个查询)
DEBUG NHibernate.Caches.SysCache2.SysCacheRegion [(null)] <(null)> - 添加新数据:key= [snipped]...参数:['809']; 命名参数:{}@ 743460424 & value=System.Collections.Generic.List`1[System.Object]
(第二次查询)
DEBUG NHibernate.Caches.SysCache2.SysCacheRegion [(null)] <(null)> - 添加新数据:key=[snipped]...参数:['809']; 命名参数:{}@ 704749285 & value=System.Collections.Generic.List`1[System.Object]
我已将 NHibernate 设置为使用查询缓存。我将这些查询设置为可缓存=true。不知道还能去哪里看。有人有什么建议吗?
谢谢
-迈克
好吧 - 我想通了。我使用以下语法执行命名查询:
IQuery q = session.GetNamedQuery("MyQuery")
.SetResultTransformer(Transformers.AliasToBean(typeof(MyDTO)))
.SetCacheable(true)
.SetCacheRegion("MyCacheRegion");
Run Code Online (Sandbox Code Playgroud)
(我可能要补充一点,NHibernate 文档正是告诉你如何做到这一点的。但我离题了;))
如果您为每个查询创建一个新的 AliasToBean 转换器,那么每个查询对象(这是缓存的关键)将是唯一的,并且您将永远不会获得缓存命中。所以,简而言之,如果你按照 nhib 文档所说的那样做,那么缓存将不起作用。
相反,在静态成员 var 中创建一次变压器,然后将其用于查询,并且缓存将起作用 - 如下所示:
private static IResultTransformer myTransformer = Transformers.AliasToBean(typeof(MyDTO))
Run Code Online (Sandbox Code Playgroud)
...
IQuery q = session.GetNamedQuery("MyQuery")
.SetResultTransformer(myTransformer)
.SetCacheable(true)
.SetCacheRegion("MyCacheRegion");
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1015 次 |
| 最近记录: |