ASP.net で情報をキャッシュするために静的変数を使用しても問題ありませんか?

StackOverflow https://stackoverflow.com/questions/151021

質問

現在、私は ASP.net 上の C# 3.5 でプロジェクト管理アプリケーションに取り組んでいます。データベースへのヒットを減らすために、静的変数を使用して多くの情報をキャッシュしています。たとえば、ユーザーのリストは静的クラスのメモリに保持されます。このクラスは起動時にデータベースからすべての情報を読み取り、変更が行われるたびにデータベースを更新しますが、データベースから読み取る必要はありません。

このクラスは、データベースへの書き込みと同時に、更新された情報を使用して他の Web サーバー (存在する場合) に ping を送信します。ping メカニズムは、ランダムな使用可能なポートを使用してキャッシュ オブジェクトを登録する Windows サービスです。他のことにも使われます。

データ量はそれほど多くありません。現時点では、ユーザー(パスワードハッシュ、権限、名前、電子メールなど)をキャッシュするためだけにこれを使用しています。データベースに対して行われる呼び出しの山を節約するだけです。

この方法には落とし穴があるのではないか、データをキャッシュするより良い方法があるのではないかと考えていました。

役に立ちましたか?

解決

落とし穴:静的フィールドのスコープはアプリ ドメインごとに設定されており、負荷が増加すると、サーバーはプール内により多くのアプリ ドメインを生成します。静的データから読み取るだけの場合、これは必ずしも問題になるわけではありませんが、メモリ内に重複したデータが取得され、アプリ ドメインが作成またはリサイクルされるたびにヒットが発生します。

Cache オブジェクトを使用することをお勧めします。このオブジェクトはこのような目的で使用されます。

編集:AppDomains について私が間違っていたことが判明しました (コメントで指摘されているように)。 応用 負荷時に生成されますが、それらはすべて同じ AppDomain 内で実行されます。(ただし、Cache オブジェクトを使用する必要があります。)

他のヒント

キャッシュが利用可能なメモリの量を超えるサイズに大きくならないことが予想される限り、問題はありません。また、データベースごとにこのアプリケーションのインスタンスが 1 つだけ存在することを確認してください。そうしないと、アプリのさまざまなインスタンスのキャッシュが「同期しなくなる」可能性があります。

私が働いているところでは、自社製の O/RM があり、あまり成長や変更が予想されない特定のテーブルに対して行っていることと同様のことを行っています。つまり、あなたがやっていることは前例のないことではなく、実際、私たちのシステムでは実証済みであり、真実なのです。

考慮しなければならないもう 1 つの落とし穴は、スレッド セーフです。すべてのアプリケーション リクエストは同じ AppDomain で実行されますが、異なるスレッドで送信される可能性があります。静的変数にアクセスする場合は、複数のスレッドからアクセスされることを考慮する必要があります。おそらく、あなたが求めているよりもオーバーヘッドが少し多いでしょう。この目的にはキャッシュ オブジェクトの方が適しています。

うーん...「古典的な」方法はアプリケーションキャッシュですが、静的変数を決して更新しない、または更新した場合のロックの問題を理解し、アプリドメインの再起動でいつでも消える可能性があることを理解している場合、実際にはわかりません。静電気を使用すると害があります。

アプリに分散キャッシュを設ける方法を検討することをお勧めします。見てみることができます Nキャッシュ または indeXus.Net

私がそう提案した理由は、キャッシュしている情報を更新する独自のアドホックな方法を開発したからです。静的変数/参照は問題ありませんが、更新/リフレッシュされず (したがって、エージングを自分で処理する必要があります)、分散セットアップを行っているようです。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top