我正在尝试追踪看似缓存的问题,而我似乎无法找到任何答案。我所拥有的是:
一系列5个消息处理程序,用于处理来自ASP.NET MVC站点的“订单”。我应该注意,当进程是一个消息处理程序时,会看到下面提到的行为。我把它分解干了它。
处理程序如下:
这个过程运行正常,每个事情都很好,有一个很大的警告:如果在站点中更改了数据库中的任何持久数据,那么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();
我的问题是:我可能错过了什么?
由于
答案 0 :(得分:2)
NHibernate具有一些令人惊叹的缓存功能,主缓存和二级缓存跨越当前会话以及整个流程。作为一个起点,我建议在NHibernate中完全禁用任何缓存:
How do I totally disable caching in nHibernate?
如果可行,您可以有选择地为每个处理程序重新启用缓存,直到问题完全隔离。我们的想法是在禁用和重新启用缓存之间来回切换,直到您可以缩小发生意外行为的位置。
你在这里描述的内容似乎也超越了NServiceBus。换句话说,如果您使用的是WCF或.NET Web服务,则可能会遇到相同的行为。