2011-03-10 82 views
0

我想追查什麼似乎是一個緩存問題,我似乎無法找到任何答案。我有什麼是:NServicebus&NHibernate緩存問題

一系列的5個消息處理程序來處理從我們的ASP.NET MVC網站'訂單'。我應該注意到,當流程是一個消息處理程序時,會看到下面提到的行爲。我打破了它幹起來。

的處理程序如下:

  • OrderCompleteHandler
  • CreateArtifact1Handler
  • CreateArtifact2Handler
  • RESTIntegrationHandler
  • 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(); 

Web配置:

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(); 

我的問題是:什麼可能我錯過了什麼?

由於

回答

2

NHibernate的具有與跨越兩個當前會話的一級和二級緩存以及整個過程中的一些驚人緩存能力。作爲一個起點,我會建議完全禁用任何緩存都內的NHibernate:

How do I totally disable caching in nHibernate?

如果這樣的作品,你可以有選擇地重新啓用緩存爲每個處理器,直至問題完全隔離。這個想法是在禁用和重新啓用緩存之間來回切換,直到您可以縮小發生意外行爲的位置。

這裏描述的內容似乎也超越了NServiceBus。換句話說,如果您使用WCF或.NET Web服務,您可能會遇到相同的行爲。

+0

我將不得不給這個鏡頭。感謝您的建議和鏈接。當我知道什麼時我會回來。 – DevSolo 2011-03-10 18:20:22