1

我们使用的是 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

在 Microsoft.ApplicationServer.Caching.ChunkStream..ctor(Byte[][] buffers, Boolean writable) 在 Microsoft.ApplicationServer.Caching.Utility 的 Microsoft.ApplicationServer.Caching.ChunkStream..ctor(Byte[][] buffers)。在 Microsoft.ApplicationServer.Caching.CacheEnumerator.MoveNext() 处反序列化(Byte[][] 缓冲区,布尔 checkTypeToLoad)\r\n

我怀疑我们的通读提供程序在错误情况下做错了,但我还没有证明这一点。但是,我不希望 AppFabric 像这样从它的核心抛出空引用异常。

这是一个已知问题吗?有没有人有任何进一步的信息可能会有所帮助?

4

1 回答 1

0

完成一些测试后,AppFabric Cache 可以优雅地处理我们的通读提供程序抛出的异常。似乎更有可能是缓存因其中一台缓存服务器的故障而损坏。我们计划使用上面的代码来监控缓存。

可以更改上面的代码,通过清除发生空引用异常的区域来删除任何问题区域:

catch (NullReferenceException)
{
    Console.WriteLine("Unable to get key value pair. Clearing region: {0}", regionName);
    cache.ClearRegion(regionName);
}

然后,通读提供程序可以再次填充缓存。

于 2012-12-03T15:43:26.753 回答