Wcf NHibernate和潜在的缓存问题

Wcf NHibernate和潜在的缓存问题,wcf,nhibernate,Wcf,Nhibernate,好的,我有一个n层模型。(WPF、Asp.Net等)通过WCF连接到后端服务。这些服务使用NHibernate与数据库通信。其中一些服务将在InstanceContextMode.Single模式下运行 问题: 在单例服务实例中,我是否应该在wcf服务处于活动状态的整个时间内尝试使用一个会话对象,以最大限度地利用缓存 如果我在这个单例实例中使用1个会话实例,并且从不创建新的会话实例,那么我假设我必须担心最终会从会话中删除缓存实体,或者将其一起转储,以避免会话出现性能问题 对于单例wcf服务,以这

好的,我有一个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");