Wcf NHibernate和潜在的缓存问题
好的,我有一个n层模型。(WPF、Asp.Net等)通过WCF连接到后端服务。这些服务使用NHibernate与数据库通信。其中一些服务将在InstanceContextMode.Single模式下运行 问题:Wcf NHibernate和潜在的缓存问题,wcf,nhibernate,Wcf,Nhibernate,好的,我有一个n层模型。(WPF、Asp.Net等)通过WCF连接到后端服务。这些服务使用NHibernate与数据库通信。其中一些服务将在InstanceContextMode.Single模式下运行 问题: 在单例服务实例中,我是否应该在wcf服务处于活动状态的整个时间内尝试使用一个会话对象,以最大限度地利用缓存 如果我在这个单例实例中使用1个会话实例,并且从不创建新的会话实例,那么我假设我必须担心最终会从会话中删除缓存实体,或者将其一起转储,以避免会话出现性能问题 对于单例wcf服务,以这
1-3:据我所知,ISession对象应该是重量轻、寿命短的对象,它们只在需要的时间内存在。我建议您在整个服务生命周期内不要使用相同的ISession对象。
我建议改为使用相同的iSessionFactory实例,并根据需要从中创建新的iSession(您可以尝试类似于每个请求会话的模式)。
如果启用二级缓存,则在此场景中可以享受缓存的所有好处 5是的,差不多。还要记住,第二级缓存实例是每个ISessionFactory实例的。这意味着,如果您使用的ISessionFactory实例超过1个,那么您的缓存将出现很多问题 6对于一级缓存,您无需定义任何内容。
对于二级缓存,您需要在配置nHibernate时启用缓存(在我的例子中是流畅的): 并为要为其启用缓存的每个实体和每个集合指定:
mapping.Cache.ReadWrite().Region("myRegion");
对于集合:
mapping.HasMany(x => x.Something)
.Cache.ReadWrite().Region("myRegion");
如果我使用二级缓存,我需要担心上面的#2吗?另外,如果我使用缓存定义实体,而我仍然能够通过config启用/禁用此行为?原则上,no-nHibernate在验证/失效、清空等方面控制缓存。是-缓存是可配置的(当然,我发布的流畅代码可以编写为XML配置)。
mapping.HasMany(x => x.Something)
.Cache.ReadWrite().Region("myRegion");