1

(Azureではなく)Windows Server AppFabric 1.1を使用しており、キャッシュを汚染して、奇妙な結果が得られたと思います。

リードスループロバイダーを使用しているため、キーがキャッシュにない場合、リードスループロバイダーはデータベースに移動し、キャッシュにデータを入力して、値をクライアントに返します。(余談ですが、Microsoftのチームは、リードスループロバイダーが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を列挙するときに、キャッシュが常にnull参照例外をスローしていたため、例外処理があります。

例外から:

Microsoft.ApplicationServer.Caching.Core

Microsoft.ApplicationServer.Caching.ChunkStream..ctor(Byte [] [] buffers、Boolean writable)at Microsoft.ApplicationServer.Caching.ChunkStream..ctor(Byte [] [] buffers)atMicrosoft.ApplicationServer.Caching.Utility。 Microsoft.ApplicationServer.Caching.CacheEnumerator.MoveNext()\ r \ nでDeserialize(Byte [] [] buffers、Boolean checkTypeToLoad)

リードスループロバイダーがエラー状態で何か問題を起こしているのではないかと思いますが、まだ証明していません。ただし、AppFabricがこのようなコアからnull参照例外をスローすることは期待していません。

これは既知の問題ですか?誰かが役立つかもしれないさらなる情報がありますか?

4

1 に答える 1

0

いくつかのテストを行った後、AppFabric Cacheは、リードスループロバイダーによってスローされた例外を適切に処理します。キャッシュサーバーの1つに障害が発生したために、キャッシュが破損した可能性が高いようです。上記のコードを使用してキャッシュを監視する予定です。

上記のコードを変更して、null参照例外が発生する領域をクリアすることにより、問題のある領域を削除できます。

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

その後、リードスループロバイダーはキャッシュに再度データを入力できます。

于 2012-12-03T15:43:26.753 に答える