gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 12:32:40 24 4
gpt4 key购买 nike

我有一个简单的单元测试,其中我使用相同的参数执行相同的 NHibernate 命名查询 2 次(每次不同的 session )。这是一个简单的 int 参数,因为我的查询是一个命名查询,所以我假设这两个调用是相同的,并且结果应该被缓存。

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

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

(第一次查询)

DEBUG NHibernate.Caches.SysCache2.SysCacheRegion [(null)] <(null)> - adding new data: key= [snipped]... parameters: ['809']; named parameters: {}@743460424 & value=System.Collections.Generic.List`1[System.Object]



(第二次查询)

DEBUG NHibernate.Caches.SysCache2.SysCacheRegion [(null)] <(null)> - adding new data: key=[snipped]... parameters: ['809']; named parameters: {}@704749285 & value=System.Collections.Generic.List`1[System.Object]



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

谢谢
-麦克风

最佳答案

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

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

(我可能会补充说,是 完全是 NHibernate 文档如何告诉你如何去做......但我离题了;))

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

相反,在静态成员 var 中创建一次转换器,然后将其用于查询,缓存将起作用 - 如下所示:
private static IResultTransformer myTransformer = Transformers.AliasToBean(typeof(MyDTO))

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

关于NHibernate 在二级缓存中找不到命名查询结果集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2766863/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com