1

私の Web アプリケーション (Spring 3.1、Hibernate 4) では、Hibernate 2nd レベル キャッシュと Spring @Cache に Ehcache を使用しています。Hibernate Cache と Spring Cache をどこで使用するか知りたいですか?

たとえば、画面上のルックアップ値として使用しているいくつかのドメイン クラス (データベース内のビュー) があります。Hibernate の第 2 レベル キャッシュと Spring @Cache を使用してキャッシュできます。

そのため、Spring @Cache を使用してこれらのドメイン オブジェクトをキャッシュする場合、サービス レイヤーでこれらのオブジェクトを受信すると、永続化レイヤー (hibernate HQL クエリ) にまったくアクセスせずにキャッシュされます。それは正しいアプローチですか?

4

2 に答える 2

4

レイヤー アーキテクチャによって異なります。

Customerエンティティのコレクション、つまりドメイン オブジェクトを返す 3 つのサービス (ま​​たは同じサービス内の 3 つのメソッド) があるとします。サービス層でキャッシュする場合、単一のデータベース レコードの同じ表現がキャッシュに複数回存在する可能性がかなりあります。それらは本質的に同じ情報の複数のオブジェクトです。なんで?Service.getWhateverCustomers(String)との結果はService.getWhateverCustomers(String, Integer)2 つの異なるキャッシュ キーに格納されるためです。

一方、JPA @Cachableアノテーションを使用してエンティティ レベルでキャッシュCustomerすると、実際にエンティティを取得するコードをどのサービスまたはサービス メソッドから呼び出しても、エンティティはキャッシュされます。もちろん、JPA プロバイダーがエンティティをキャッシュできる/キャッシュするタイミングに関するルールが適用されます。それらに慣れていない場合は、それらを読んでください。

これにより、どのパスをたどるかのアイデアが得られることを願っています。さらに質問がある場合は、フォローアップのコメントを投稿してください。この回答を編集します。

于 2012-12-26T21:12:05.540 に答える
0

正しいアプローチは次のとおりです。

  1. キャッシングの複雑さをいじる必要があるかどうかを自問してください。アプリが要件を満たしていませんか?
  2. 前の質問に対する答えが「はい」の場合のみ、アプリをプロファイリングして、パフォーマンスの問題がどこにあるかを調べます。
  3. 手順 2 で特定されたパフォーマンスの問題を解決する適切な方法を決定します。コストのかかる操作を防ぐために、キャッシュが必要な場合とそうでない場合があります。キャッシュが必要な場合は、何が起こらないようにしようとしているのかを正確に把握できるため、キャッシュする場所と使用するキャッシュを十分に明確にする必要があります。

この話の教訓は、クールだからキャッシュしないということです。パフォーマンスのためにキャッシュします。また、必要であると証明された場合にのみ、コードを最適化します

于 2012-12-27T01:44:44.800 に答える