2012-02-16 6 views
1

現在、ASP.NETデータベース(EntitySpaces ORMを使用)でASP.NETレポートアプリケーション(C#)を開発中です。パフォーマンス/応答性は、このアプリケーションの成功にとって非常に重要です。数日のうちに1000人が使用するためです。私はこれがボトルネックになることを知っているので、データベースへの往復を避けたいと思っています。私の最初の考え方(データベースの物理的なサイズが比較的小さいため)は、アプリケーションキャッシュ内のすべてのデータベースオブジェクトを単にキャッシュし、必要に応じてキャッシュからそれらを照会することでした。私はすぐに、ASP.NETがキャッシュから項目を削除し始めたとき、おそらくあまりにも多くのメモリが使用されていたため、私のロジックに欠陥があることを認識しました。ASP.NETのオブジェクト/コレクションの格納とアクセスに関するガイダンス

これを行う別の方法がありますか?ガベージコレクションによって消費されないことを保証できるアプリケーションが開始されたときに静的コレクションを格納する別の方法がありますか?私はページレベルのキャッシングをよく知っていますが、基本的に個々のユーザーに固有の一連の特別なレポートを作成しているので、あまり役に立ちません。

EDIT:もう少し明確にするために、キャッシュされるすべてのデータのサイズは< 5 MBです。アイデアはすべてのオブジェクトをキャッシュして、linqでコレクションをフィルタリングすることでした。

+0

あなたは、データの任意のページングをやっていますか?人々がフィルタを置くことを許可しますか?何行目で話していますか?どんな方法を選んでもトレードオフがあります。選択肢の中には、メモリを犠牲にしてパフォーマンスを得るものや、ディスク容量を犠牲にしてパフォーマンスを得るものがあります。アプリケーションプールの設定(X時間やXメモリまたはX CPU後にリサイクル)によっては、アプリケーションプール全体がキャッシュされたアイテムのすべてを削除してアプリケーションメモリのキャッシュを無効にすることがあります。 –

+0

NOSQL DBのような外部キャッシュサーバーを使用できます。実装が非常に簡単で、コードの変更が必要なことはあまりありません。それらの多くは無料でオープンソースです。あなたがこれらのオプションに興味があるなら私に知らせてください、私はサイトのカップルにあなたを指し示すことができます。 – ASetty

+0

私は上記の問題をもう少し明確にしました。最新のアイデアは、アプリケーションキャッシュの使用を継続することですが、CacheItemPriority.NotRemovableオプションを使用してください。 –

答えて

0

私はすでにあなたが知っていると確信しているように、インデックス作成は良いアイデアです。その後、サーバのハードウェアは、本当に重大なパフォーマンスが必要な場合、RAIDed SSDに切り替えて、通常のHDへの夜間バックアップを使用して、データを提供するデータベースの能力に大きな影響を与えます。

それ以外にも、テーブルのデザインは速度に影響する可能性があります。あなたはデータベースがかなり小さいことに気付いたので(Oracleは通常より大きなもののために使用されるため、修飾する必要があります)、おそらくそれほど多くはありません。

本当にスピードが必要な場合は、マルチホームNICを使用して、データを要求するサーバーに直接接続することができます。

メモリにデータを保存することは、パフォーマンス上ディスクにデータをコミットすることを好むため、RDBMSに関しては本当に素晴らしいアイデアではありません。あなたが欠けている可能性があるという考えが気にならない場合(本当に重要な/バックアップが必要なことは何もしていない)、メモリのみのデータベースを使うことができます。また、構築するデータベースマシンは、プロセッサとメモリを備えた詰め物に梱包する必要があります(スクリム処理なし)。

原則として、より厳密な/より手作業のコーディングとエキゾチックなハードウェアでより多くのパフォーマンスを得ることができますが、問題は価格に値するでしょうか?追加の10%のパフォーマンスを得るために必要なリソースは、ポルシェピストン対VWピストンの追加の精度に必要なリソースに似ています。>その性能を得るには、以前の量より10倍のコストがかかります。そのような種類のお金があり、そのような種類の業績を必要とする私が知っている(私の頭の頂上から離れている)唯一の人々は、各国政府の暗号化翼、あるいは高頻度の貿易会社のいずれかのために働いています。

0

は、データのサイズによっては、あなたがアプリケーションの状態でそれを保存することができます保存する必要があります。

する方法:アプリケーションの状態に値を保存する方法http://msdn.microsoft.com/en-us/library/94xkskdf.aspx

:アプリケーション状態http://msdn.microsoft.com/en-us/library/y8hhek39.aspxから値を読みます

最後に、あなたはあなたのアプリケーションのGlobal.asaxファイル内のApplication_Startメソッドで変数を設定することができます。http://www.techrepublic.com/article/working-with-the-aspnet-globalasax-file/5771721

+1

Application Startを使用してデータを検索して保存するときは、慎重に考えてください。最初のリクエストを処理する前に、これらのルックアップをすべて実行している間は、アプリケーションは最初のリクエストでハングすることに注意してください。これは、新しいアプリケーションプールを開始する秒をあなたのアプリに追加することができます。より良いアプローチはおそらく必要に応じてアイテムをキャッシュに追加するか、HTTPキャッシュを使用してアイテムをメモリに保存できるようにし、X分後に使用されていない場合は期限切れにします(スライドの有効期限切れ)。 –

関連する問題