好的,我有一个n层模型。 (WPF,Asp.Net等)通过WCF后端服务。这些服务使用NHibernate与数据库进行通信。其中一些服务将在InstanceContextMode.Single模式下运行。
问题:
答案 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");