NServicebus& NHibernate缓存问题

时间:2011-03-10 14:24:05

标签: nhibernate nservicebus

我正在尝试追踪看似缓存的问题,而我似乎无法找到任何答案。我所拥有的是:

一系列5个消息处理程序,用于处理来自ASP.NET MVC站点的“订单”。我应该注意,当进程是一个消息处理程序时,会看到下面提到的行为。我把它分解干了它。

处理程序如下:

  • OrderCompleteHandler to
  • CreateArtifact1Handler to
  • CreateArtifact2Handler to
  • RESTIntegrationHandler to
  • EMailHandler 已完成

这个过程运行正常,每个事情都很好,有一个很大的警告:如果在站点中更改了数据库中的任何持久数据,那么nservicebus处理程序在重新处理相同的处理程序时看不到反射的数据结果

我们已经实现了一个带有以下代码的IMessageModule:

public void HandleBeginMessage()
{
   CurrentSessionContext.Bind(SessionFactory.OpenSession());
}

如果我重新启动servicebus,数据更改会得到正确反映,这可能会(或许不正确)指向servicebus端配置错误的内容。

NServiceBus配置:

 return Fluently.Configure()
    .Database(
       MsSqlConfiguration.MsSql2005
          .CurrentSessionContext( "NHibernate.Context.ThreadStaticSessionContext, NHibernate" )
          .ConnectionString(c => c.FromAppSetting("connection.string"))
          .ProxyFactoryFactory("NHibernate.ByteCode.Castle.ProxyFactoryFactory, NHibernate.ByteCode.Castle")
          .ShowSql())
    .Mappings(m =>
    {
       m.FluentMappings.AddFromAssemblyOf<UserMapping>();
       m.FluentMappings.Conventions.AddFromAssemblyOf<EnumConvention>();
    })
    .ExposeConfiguration(cfg =>
    {
       cfg.EventListeners.PostInsertEventListeners = new IPostInsertEventListener[] { new AuditLogEventListener() };
       cfg.EventListeners.SaveEventListeners = new ISaveOrUpdateEventListener[] { new AuditLogEventListener() };
       cfg.SetProperty("cache.provider_class", "NHibernate.Cache.HashtableCacheProvider");
       cfg.SetProperty("cache.use_second_level_cache", "true");
       cfg.SetProperty("cache.use_query_cache", "true");
    } )
    .BuildSessionFactory();

网络配置:

return Fluently.Configure()
    .Database(
        MsSqlConfiguration.MsSql2005
           .Cache(c => c
              .UseQueryCache()
              .ProviderClass<SysCacheProvider>() )
           .CurrentSessionContext("NHibernate.Context.ManagedWebSessionContext, NHibernate")
           .ConnectionString(c => c
              .FromAppSetting("connection.string"))
           .ProxyFactoryFactory("NHibernate.ByteCode.Castle.ProxyFactoryFactory, NHibernate.ByteCode.Castle")
           .ShowSql())
    .Mappings(m =>
    {
        m.FluentMappings.AddFromAssemblyOf<UserMapping>();
        m.FluentMappings.Conventions.AddFromAssemblyOf<EnumConvention>();
    })
    .ExposeConfiguration(cfg =>
    {
        cfg.EventListeners.PostInsertEventListeners = new IPostInsertEventListener[] { new AuditLogEventListener() };
        cfg.EventListeners.SaveEventListeners = new ISaveOrUpdateEventListener[] {new AuditLogEventListener()};
    })
    .BuildSessionFactory();

我的问题是:我可能错过了什么?

由于

1 个答案:

答案 0 :(得分:2)

NHibernate具有一些令人惊叹的缓存功能,主缓存和二级缓存跨越当前会话以及整个流程。作为一个起点,我建议在NHibernate中完全禁用任何缓存:

How do I totally disable caching in nHibernate?

如果可行,您可以有选择地为每个处理程序重新启用缓存,直到问题完全隔离。我们的想法是在禁用和重新启用缓存之间来回切换,直到您可以缩小发生意外行为的位置。

你在这里描述的内容似乎也超越了NServiceBus。换句话说,如果您使用的是WCF或.NET Web服务,则可能会遇到相同的行为。