Webアプリがいくつかの情報を頻繁にクエリする場合、クエリ結果をキャッシュしてパフォーマンスを向上させる方法はありますか?(情報はWebサイトのトップニュースのようなもので、私のデータベースはSQL Server 2008であり、アプリケーションはTomcatにあります。)
3 に答える
私は次のことを提案することができます:
- データベースでidexビューを使用できます。以下を確認してください 。MSSQLServerでOracleマテリアライズドビューを模倣する方法は?。
- JPAまたはHibernateを使用した場合は、エンティティ(オブジェクト)をキャッシュできます。
- データベースやORMにとって外部のキャッシュシステムを探している場合は、MemCacheまたはEHCacheを確認できます。
- オプションですが、お勧めしませんが、アプリケーションでキャッシュを管理することです。たとえば、国のリストをServletContext(ApplicationContextとも呼ばれます)に保存できますが、キャッシュのビジネスロジック(オブジェクトの更新、削除、挿入)を実装する必要があります。 )、ヒープメモリにも注意する必要があります。
あなたはそれがあなたのビジネスの文脈に依存する上記の戦略の組み合わせを使うことができます
よろしくお願いします、
エルネスト。
これはかなり一般的な質問であり、ご想像のとおり、多くのオプションがあります。
UIに最も近い場合、Webプラットフォームには「コンテンツキャッシュ」がある可能性があります。たとえば、ASP.NETは、指定された期間、ページの一部をキャッシュします。
memcachedのようなキャッシュツールを使用して、レコードセット(またはスタンドアロンのJavaデータ構造)をキャッシュできます。
一部のORMはキャッシュも提供します。
そして(おそらく最終的にではない)、複雑なクエリを実行し、より頻繁にクエリされるがクエリが安価なテーブルに結果を保存することで、このような結果を「キャッシュ」するようにデータベースの構造を定義できます。
いくつかのアイデア。
本当に大きなサイトの答えは上記のすべてです。ストアドプロシージャを介してすべてのクエリを実行します。これは、クエリがコンパイルされ、1つの実行プランが再利用されるために役立ちます。邪悪な複雑なテーブル値関数があります。キャッシュテーブルを作成するのは非常に高価です。テーブルには、関数と同じ一般的な形式がありますが、2つの追加機能があります。1つは有効期限です。もう1つは検索キーです。検索キーは、一緒に連結された関数に入るパラメーターです。そのテーブルをクエリしようとするときはいつでも、Procを実行して、データが古くなっているかどうかを確認します。トランザクションを開始する場合は、行を削除してから、関数を実行して行を挿入します。これは、以前の2〜3%の時間で関数を実行し、古さをチェックするために行うproc呼び出しの方がはるかに安価であることを意味します。アプリが関連データを更新するたびに、アプリは古いものとしてキャッシュ行を更新しますが、それらを削除しない場合は、キャッシュチェック機能に任せます。なんで?たぶん、今は誰もそのデータを必要としないので、dbヒットが少なくなります。次に、2番目のレイヤーをヒットします。多くのレコードセットをmemcachedにキャッシュします。その関数を呼び出すすべてのプロシージャ、およびその他多数を含みます。それは実際には私たちがまだ持っているaspレイヤーで起こります。ADOレコードセットはネイティブでxmlに永続化でき、xmlは文字列としてmemcacheに入ります。それは実際には私たちがまだ持っているaspレイヤーで起こります。ADOレコードセットはネイティブでxmlに永続化でき、xmlは文字列としてmemcacheに入ります。それは実際には私たちがまだ持っているaspレイヤーで起こります。ADOレコードセットはネイティブでxmlに永続化でき、xmlは文字列としてmemcacheに入ります。