23

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

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

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

この方法に落とし穴があるかどうか、および/またはデータをキャッシュするためのより良い方法があるかどうか疑問に思いましたか?

4

5 に答える 5

16

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

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

編集:AppDomainsについて間違っていたことがわかりました(コメントで指摘されているように)-アプリケーションのより多くのインスタンスが負荷の下で生成されますが、それらはすべて同じAppDomainで実行されます。(ただし、まだCacheオブジェクトを使用する必要があります!)

于 2008-09-29T22:42:08.073 に答える
4

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

私が働いているところには、自家製の O/RM があり、大きくなったり変更されたりすることがあまり期待されない特定のテーブルであなたがしていることと似たようなことをしています。つまり、あなたがしていることは前例のないことではありません。実際、私たちのシステムでは、実証済みです。

于 2008-09-29T22:49:25.203 に答える
4

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

于 2008-09-29T22:52:29.577 に答える
0

うーん...「クラシック」な方法はアプリケーションキャッシュですが、静的変数を更新したり、更新した場合にロックの問題を理解したりすることがなく、アプリドメインを再起動するといつでも消えることがあることを理解していれば、私はしません。スタティックを使用することの害を実際に確認します。

于 2008-09-29T22:38:30.393 に答える
0

アプリの分散キャッシュを使用する方法を検討することをお勧めします。NCacheまたはindeXus.Netを見ることができます

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

于 2008-09-30T01:48:30.810 に答える