我们使用的是Windows Server AppFabric 1.1(而不是Azure),我认为我们已经设法污染了缓存,因此我们得到了一些奇怪的结果。
我们正在使用一个直通式提供程序,因此当密钥不在缓存中时,直读式提供程序会进入数据库,填充缓存并将值返回给客户端。 (顺便说一下,微软的团队决定要求通读提供商应该在GAC中生活 - 这不会导致痛苦,所以我建议不要使用直读。我希望他们重新考虑这个选择。)
我的问题的症状是,当我尝试从缓存中获取一个项目时,当我希望读取提供程序从数据库中获取值时,它返回null。重复调用返回null,排除数据库的任何暂时问题。如果我从缓存中删除该项并尝试再次获取它,则会成功。
为了尝试理解问题的严重程度,我想我会列举缓存中的所有项目,如下所示:
foreach (string regionName in cache.GetSystemRegions())
{
var objectsInRegion = cache.GetObjectsInRegion(regionName);
try
{
foreach (var keyValuePair in objectsInRegion)
{
var result = string.Format(
"Key: {0}. Value: {1}", keyValuePair.Key, keyValuePair.Value);
Console.WriteLine(result);
}
}
catch (NullReferenceException)
{
Console.WriteLine("Unable to get key value pair");
}
}
异常处理是因为缓存在为特定区域枚举objectsInRegion时始终抛出空引用异常。
来自例外:
Microsoft.ApplicationServer.Caching.Core
at Microsoft.ApplicationServer.Caching.ChunkStream..ctor(Byte [] [] buffers,Boolean writable) 在Microsoft.ApplicationServer.Caching.ChunkStream..ctor(Byte [] [] buffers) 在Microsoft.ApplicationServer.Caching.Utility.Deserialize(Byte [] [] buffers,Boolean checkTypeToLoad) 在Microsoft.ApplicationServer.Caching.CacheEnumerator.MoveNext()\ r \ n
我怀疑我们的直读提供商在错误条件下做错了什么,但我还没有证明这一点。但是,我不希望AppFabric像这样从它的核心抛出一个空引用异常。
这是一个已知问题吗?有没有人可以提供更多可能有帮助的信息?
答案 0 :(得分:0)
完成一些测试后,AppFabric Cache可以优雅地处理由我们的直读式提供程序抛出的异常。似乎更有可能的是,缓存被其中一个缓存服务器的故障破坏了。我们计划使用上面的代码来监控缓存。
通过清除出现空引用异常的区域,可以更改上面的代码以删除任何问题区域:
catch (NullReferenceException)
{
Console.WriteLine("Unable to get key value pair. Clearing region: {0}", regionName);
cache.ClearRegion(regionName);
}
然后,再次可以通过读取提供程序填充缓存。