繁体   English   中英

NHibernate和潜在的缓存问题

[英]NHibernate and potential caching problems

好的,所以我有一个n层模型。 (WPF,Asp.Net等)通过WCF进行后端服务。 这些服务使用NHibernate与数据库进行通信。 其中一些服务将在InstanceContextMode.Single模式下运行。

问题:

  1. 在单例服务实例中,我应该在wcf服务处于活动状态的整个过程中尝试利用1个会话对象来最大程度地利用我的缓存吗?
  2. 如果我在此单例实例中使用1个会话实例,并且从不创建新实例,那么我认为我不得不担心最终从会话中删除缓存的实体或将其全部转储以避免会话性能问题?
  3. 以这种方式将会话用于单例wcf服务是个好主意吗? 如果我想利用缓存,就好像是这样。
  4. 我应该在这种情况下利用二级缓存吗?
  5. 在这种情况之外,什么时候应该避免缓存? 我假设我想在任何创建/更新大量对象并且在创建或更新之外再也没有真正使用过的对象的批处理场景中避免使用它。
  6. 创建/读取/更新/删除项目时,项目是否会自动缓存在会话中,还是需要在映射文件或配置中指定某些内容?

1-3:据我所知,ISession对象应该是重量轻,寿命短的对象,它们仅在需要它们的持续时间内存在。 我建议AGAINST在您的服务的整个生命周期中都使用相同的ISession对象。
我建议使用的是相同的ISeessionFactory实例,并根据需要从中创建新的ISession(您可以尝试使用类似于Session-Per-Request模式的方法)。
如果启用第二级缓存,则在这种情况下可以享受缓存的所有好处。

5是的,差不多。 还要记住,第二级缓存实例是每个ISessionFactory实例 这意味着,如果您使用多个ISessionFactory实例,则您的缓存会遇到很多问题。

对于1级缓存,您不需要定义6。
对于二级缓存,您需要在配置nHibernate时启用缓存(以我为例):

.Cache(c => c.UseQueryCache()
                                    .ProviderClass(
                                    isWeb ? typeof(NHibernate.Caches.SysCache2.SysCacheProvider).AssemblyQualifiedName //in web environment- use sysCache2
                                        : typeof(NHibernate.Cache.HashtableCacheProvider).AssemblyQualifiedName //in dev environmet- use stupid cache
                                    )) 
                          )

并为您要为其启用缓存的每个实体和每个集合指定:

mapping.Cache.ReadWrite().Region("myRegion");

并进行收集:

mapping.HasMany(x => x.Something)
.Cache.ReadWrite().Region("myRegion");

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM