2

私は、MS SQLServer2005データベースを使用してSpring-Hibernateで開発された自動車メーカーに属するWebベースのアプリケーションに取り組んでいます。

このアプリケーションを介して、エンドユーザーはWebベースのインターフェイスを介して車、バス、トラックなどの作成を要求できます。ユーザーがログインすると、車両の技術仕様をキャプチャするためのHTMLフォームが表示されます。たとえば、誰かが車をリクエストしたい場合は、エンジンのメーカー/モデル、タイヤ、シャーシの詳細などを指定できます。全体で100のフォーム要素があります。 [車両リクエストの作成]画面で、オプションを表示するためのドロップダウン(選択ボックス)が30%あります(つまり、ユーザーはそのうちの1つを選択できます)。これらのSELECTボックスは、データベース(マスターデータ)に保存されている値から入力されます。このマスタデータは、バックエンドでストアドプロシージャを実行することにより、少なくとも週に1回変更されます。

このアプリケーションには世界中で約10,000人のユーザーがおり、新しい車両のリクエストでは毎日最大で5000ヒットが見込まれます。つまり、5000回の車両作成フォームが表示されます。

私の質問は、マスターデータから表示されるフォームフィールドの値を保存するために第2レベルのキャッシュオプションを使用する必要がありますか?

これらの値は、週に1回だけ変更される一連のマスターテーブルから表示されるため、マスターデータのキャッシュはパフォーマンスの向上に役立つと思いますが、アプリケーションをに移動していないため、よくわかりません。実際のパフォーマンスを確認し、本当にキャッシングが必要かどうかを確認するためのプロダクション。

キャッシングを使用する場合、それを構成する方法を理解するために1〜2週間を費やす必要があるかもしれませんが、実際のメリットが見られずに1〜2週間を費やしたくありませんか?

これについて専門家の助けが必要です。また、誰かが実際のシナリオを共有できる場合は、キャッシングが本当に必要な場合に非常に役立ちます。

4

2 に答える 2

3

私の質問は、マスターデータから表示されるフォームフィールドの値を保存するために第2レベルのキャッシュオプションを使用する必要がありますか?

する必要はありませんが、できます。また、不変の参照データ(国、州、税コード、またはこの場合はエンジン、タイヤ、シャーシなど)などの読み取り専用データ(またはほとんどが読み取り)は、第2レベルのキャッシュ(および必要に応じてクエリキャッシュ)の最適な候補です。 )。

これらの値は、週に1回だけ変更される一連のマスターテーブルから表示されるため、マスターデータのキャッシュはパフォーマンスの向上に役立つと思います。

そうですね、ハードウェアの量やクラスターのサイズなどによっては、アプリが負荷を処理できる場合があります。しかし、私が書いたように、読み取り専用データをキャッシュすることは非常に一般的です。

  • 毎回データベースにアクセスすることに意味はありません
    • これらのヒットを回避することは、たとえそれが今問題ではないとしても、長期的には害を及ぼすことはありません。
  • それらは頻繁に変更されることはなく、キャッシュすることは扱いやすく、非常にうまく機能します

キャッシュするということは、オブジェクト表現がガベージコレクションされないことを意味するため、メモリの必要性が少し増える可能性があることに注意してください。

しかし、実際のパフォーマンスを確認し、本当にキャッシュが必要かどうかを確認するために、アプリケーションを本番環境にまだ移動していないので、よくわかりません。

正直なところ、パフォーマンスの問題があるかどうかを確認するために、本番環境まで待つべきではありません。専用環境でアプリケーションをロードまたはストレステストしてから、アプリケーション、JVM、アプリサーバー、データベースなどを調整する必要があります。また、測定できないものを改善することはできません

キャッシングを使用する場合、それを構成する方法を理解するために1〜2週間を費やす必要があるかもしれませんが、実際のメリットが見られずに1〜2週間を費やしたくありませんか?

それほど複雑ではありません。Hibernate構成で第2レベルのキャッシングとクエリキャッシングをアクティブ化し、キャッシングプロバイダーを選択する必要があります。私の推奨はEhCacheを使用することであり、関連するプロパティは次のとおりです。

hibernate.cache.use_second_level_cache=true
hibernate.cache.use_query_cache=true
hibernate.cache.provider_class=org.hibernate.cache.EhCacheProvider

次に、関連するエンティティをキャッシュ可能としてマークします(IDでロードしない場合は、データの取得に使用されるクエリをキャッシュします)。

evictまた、第2レベルのキャッシュを使用する場合は、Hibernate APIを介してデータを更新するのではなく、ストアドプロシージャ(のメソッドを使用)を使用するため、キャッシュを手動で削除する必要がありますSessionFactory。これには、数行のコードが必要になります。これが可能な場合は、アプリを再起動することもできます。

于 2010-09-05T20:19:48.963 に答える
2

1日あたり5000ヒットはトラフィックが多いように聞こえますが、これは1分あたりわずか3.5ヒットであることに注意してください。データベースが数百ミリ秒以内にページをレンダリングするために必要なすべてのクエリを実行できると仮定すると、おそらく問題ありません。

そうは言っても、キャッシングは素晴らしい次のステップです。データが変更されることはめったにないので、クエリキャッシュが役立つようです。

于 2010-09-05T16:58:53.760 に答える