0

複数のオブジェクトがキャッシュされているWebサイトで非常に奇妙な問題が発生しました。後のリクエストですばやくフェッチするためにキャッシュされるDataTable、文字列、ブール値などがたくさんあります。

一部のキャッシュアイテムが混同されているように見える定期的なエラーが発生することがあります。これがどのように表示されるかの例は、コードの一部がキャッシュからDataTableをフェッチし、そのDataTableの特定の列にアクセスしようとした場合です。次に、「列[ColumnName]が見つかりません」という例外を除いて、黄色の画面が表示されます。「ColumnName」は、もちろんDataTableにあるはずの列名です。小さな自家製ツールを使用してキャッシュアイテムを調べると、まったく異なるDataTableがキャッシュアイテムに含まれていることがわかります。これは、いくつかのキャッシュアイテムが混同されているようです。

誰かがこれがどのように起こるかについての考えを持っていますか?

エラーを再現することはできません。それは明らかにランダムな間隔で発生します。

4

1 に答える 1

0

問題は何ですか

アイテムをキャッシュに追加するときは、アイテムを作成してキャッシュに追加したプロセスをロックする必要があります。

最初に、キャッシュがデータへの参照を保持していること、それらを複製していないこと、そのデータではないものを知っていることを明確にしましょう! 参照: http://msdn.microsoft.com/en-us/library/6hbbsfk6(VS.71).aspx

2 番目に、ページのデフォルトセッションはページをロックすることであり、ページが完全に読み込まれて送信されるまですべてのユーザーがロックされるため、ほとんどのリクエストが安全になることを明確にします。

その出現時

そのため、スレッド、ハンドラー、またはセッションがオフになっているページによってキャッシュを作成しようとすると、ロックの問題が発生する可能性があります。

ロックする方法

1 つのプールのみを使用する場合は単純に機能し、多くのプールを使用する場合はロックlock(object){}に使用する必要がありますmutex()

データを後で変更してキャッシュにまだ存在する場合は、データを作成するプロセス全体をロックする必要があります。または、それらのクローンを作成する場合は、キャッシュ参照のみをロックする必要があります。

たとえば、キャッシュから取得したデータを読み取った場合、それらを編集するときに、他の人が同じキャッシュを読み取った場合、キャッシュがそれらへの参照を提供するため、破損したデータが取得されます。

これがすべて役立つことを願っています。

于 2012-06-11T11:59:31.757 に答える