Nhibernate AppFabric缓存&x27;s的本地缓存不适用于我们。。。我们做错了什么?

Nhibernate AppFabric缓存&x27;s的本地缓存不适用于我们。。。我们做错了什么?,nhibernate,caching,appfabric,second-level-cache,Nhibernate,Caching,Appfabric,Second Level Cache,我们使用appfabric作为NHibernate asp.net应用程序的第二级缓存,该应用程序包括面向客户的网站和管理网站。它们都连接到同一个缓存,因此当管理员更新某个内容时,面向客户的站点将被更新 它似乎工作正常-我们在一个单独的服务器上有一个CacheCLuster,一切都很好,但我们想让localcache获得更好的性能,然而,它似乎没有工作 我们已经这样启用了它 bool UseLocalCache = int LocalCacheObjectCount = int.Max

我们使用appfabric作为NHibernate asp.net应用程序的第二级缓存,该应用程序包括面向客户的网站和管理网站。它们都连接到同一个缓存,因此当管理员更新某个内容时,面向客户的站点将被更新

它似乎工作正常-我们在一个单独的服务器上有一个CacheCLuster,一切都很好,但我们想让localcache获得更好的性能,然而,它似乎没有工作

我们已经这样启用了它

  bool UseLocalCache = 
  int LocalCacheObjectCount = int.MaxValue;
  TimeSpan LocalCacheDefaultTimeout = TimeSpan.FromMinutes(3);
  DataCacheLocalCacheInvalidationPolicy LocalCacheInvalidationPolicy = DataCacheLocalCacheInvalidationPolicy.TimeoutBased;

        if (UseLocalCache)
        {
            configuration.LocalCacheProperties =
                new DataCacheLocalCacheProperties(
                    LocalCacheObjectCount,
                    LocalCacheDefaultTimeout,
                    LocalCacheInvalidationPolicy
                    );

          //  configuration.NotificationProperties =  new DataCacheNotificationProperties(500, TimeSpan.FromSeconds(300));
        }
最初,我们尝试使用超时失效策略(3分钟),我们的应用程序感觉运行得更快。然而,我们注意到,如果我们在管理站点中更改了某些内容,它会立即在live站点中更新。由于我们使用的是超时而不是通知,这表明没有查询本地缓存(或者是,但总是缺少)

cache.GetType().Name返回“LocalCache”-因此工厂创建了一个本地缓存

在我的开发环境中的PS中运行“Get Cache Statistics MyCache”(asp.net应用程序从vs2008本地运行,缓存集群在单独的w2k8机器上运行)会显示少量请求计数。然而,在生产环境中,请求数量急剧增加

我们尝试按照这里的方法使用缓存cliebt服务器流量。。。但是日志文件中除了最初的头文件之外什么都没有,也就是说,没有loggin

我在SO或Google中找不到任何东西

我们做错什么了吗?我们有没有安装AppFabric?我想是通过WebPlatform安装程序安装的? (注意:运行ASp.net的IIS框不在集群中-它只是客户端)


任何深刻的见解都会被接受

您是否尝试过使用nhibernate探查器

还有一点:

这是管理和查看缓存的好方法


这两种方法都可能有助于调试问题。

您使用哪些
DataCache
方法从缓存中读取数据?不管配置了本地缓存,一些
DataCache
方法都会对服务器产生影响。如果您希望利用本地缓存,则必须确保只使用
Get

这是我在AppFabric缓存方面最大的缺点之一。他们没有向您解释任何这些,因此当您开始依赖本地缓存时,您开始陷入这些小陷阱,因为您不认为与服务交谈、通过线路传输数据和反序列化对象会给您带来损失,但您确实如此


最糟糕的是,我可以理解必须与服务对话以确保本地缓存代表最新数据。我甚至可以理解如何将数据传输回去,从而避免多次呼叫。然而,在我的一生中,我无法理解的是,即使本地缓存中的实例被验证为仍然是从缓存返回的当前版本,它们仍然将对象从线路中反序列化,而不仅仅是返回内存中已经存在的实例。如果您的对象很大/很复杂,这可能会造成很大的伤害。

经过几天的研究,我们终于解决了为什么会出现这么多本地缓存未命中的问题:

  • AppFabric v 1.1中存在一个在CU4中修复的本地缓存错误,请参阅
  • 确保应用程序使用的Microsoft.ApplicationServer.Caching.Client.dll也已更新。我们在机器上安装了CU4,但从应用程序中的NuGet包中获得了不带CU4的Client.dll。在我们的例子中,一个简单的NuGet包更新使一切正常

  • 在安装CU4并确保Client.dll也已更新之后,由于本地缓存命中率增加,我们将对AppFabric主机的读取量减少了很多。耶

    很抱歉,我应该说,是的,我们使用了NH prof,NHProf说所有的东西都是缓存命中的-但是我们现在遇到的问题是,它似乎命中了缓存集群,而不是本地缓存。mdcaadmintool也帮不上我们的忙,因为它只会告诉我们缓存集群中发生了什么,而不是本地缓存,本地缓存将与我们的asp.net w3wp.exe一起保存。谢谢你的想法。