現在、ASP.NETデータベース(EntitySpaces ORMを使用)でASP.NETレポートアプリケーション(C#)を開発中です。パフォーマンス/応答性は、このアプリケーションの成功にとって非常に重要です。数日のうちに1000人が使用するためです。私はこれがボトルネックになることを知っているので、データベースへの往復を避けたいと思っています。私の最初の考え方(データベースの物理的なサイズが比較的小さいため)は、アプリケーションキャッシュ内のすべてのデータベースオブジェクトを単にキャッシュし、必要に応じてキャッシュからそれらを照会することでした。私はすぐに、ASP.NETがキャッシュから項目を削除し始めたとき、おそらくあまりにも多くのメモリが使用されていたため、私のロジックに欠陥があることを認識しました。ASP.NETのオブジェクト/コレクションの格納とアクセスに関するガイダンス
これを行う別の方法がありますか?ガベージコレクションによって消費されないことを保証できるアプリケーションが開始されたときに静的コレクションを格納する別の方法がありますか?私はページレベルのキャッシングをよく知っていますが、基本的に個々のユーザーに固有の一連の特別なレポートを作成しているので、あまり役に立ちません。
EDIT:もう少し明確にするために、キャッシュされるすべてのデータのサイズは< 5 MBです。アイデアはすべてのオブジェクトをキャッシュして、linqでコレクションをフィルタリングすることでした。
あなたは、データの任意のページングをやっていますか?人々がフィルタを置くことを許可しますか?何行目で話していますか?どんな方法を選んでもトレードオフがあります。選択肢の中には、メモリを犠牲にしてパフォーマンスを得るものや、ディスク容量を犠牲にしてパフォーマンスを得るものがあります。アプリケーションプールの設定(X時間やXメモリまたはX CPU後にリサイクル)によっては、アプリケーションプール全体がキャッシュされたアイテムのすべてを削除してアプリケーションメモリのキャッシュを無効にすることがあります。 –
NOSQL DBのような外部キャッシュサーバーを使用できます。実装が非常に簡単で、コードの変更が必要なことはあまりありません。それらの多くは無料でオープンソースです。あなたがこれらのオプションに興味があるなら私に知らせてください、私はサイトのカップルにあなたを指し示すことができます。 – ASetty
私は上記の問題をもう少し明確にしました。最新のアイデアは、アプリケーションキャッシュの使用を継続することですが、CacheItemPriority.NotRemovableオプションを使用してください。 –