NHibernate 二级缓存不缓存查询缓存的结果

NHibernate Second Level Cache not caching results from Query Cache

在我们的应用程序配置中,我们已将 NHibernate 配置为使用 SysCacheProvider 启用的二级缓存和查询缓存,配置流畅...

.Cache(x => x.UseQueryCache().ProviderClass<SysCacheProvider>().UseSecondLevelCache())

我们有一个名为 Lookup 的实体,在其映射文件中标有 Cache.ReadOnly(),我们使用 CreateCriteriaSetCacheable(true).SetCacheMode(CacheMode.Normal).[=16= 来获取它]

问题是二级缓存好像没有用到。使用 NHProf,我们可以看到第一个获取 Lookup 的查询(通过唯一的字符串 ID)被正确缓存,但是在每次调用时 NHibernate 然后去数据库通过缓存的 sql ID 获取行,而不是比使用二级缓存。

我什么都做了in this blog,但无济于事。

还有什么我需要做的吗,或者是否有任何陷阱可能意味着实体不会被添加到二级缓存中?

您在使用交易吗?

如果答案是否定的,放弃二级缓存,或者开始使用事务。为了确保它仅缓存有效数据,如果在不使用事务的情况下修改数据,缓存类型会自行禁用。

这是一个常见的陷阱,试图在不使用事务的情况下使用缓存,如here. This confirms it too. Another reason could be this one,比较棘手。

当我们从 NServiceBus 处理程序中使用 NHibernate 时,缓存失败。事实证明,在 NSB 处理程序中,我们使用的版本 the second level cache is not supported(版本 5.x)。