NHibernate和潜在的缓存问题

时间:2011-04-20 03:03:39

标签: wcf nhibernate

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

问题:

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

1 个答案:

答案 0 :(得分:3)

1-3:据我所知,ISession对象应该是轻量级的短寿命对象,它们仅在需要的时间内存在。我会建议AGAINST在服务的整个生命周期内使用相同的ISession对象 我建议使用相同的ISeessionFactory实例,并根据需要从中创建新的ISessions(您可以尝试类似于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");