64

Spring 3 と Hibernate 3.6 を使用した Web アプリケーションの開発に取り組んでいます。現時点では、Spring と Hibernate によるキャッシュがどのように機能するかを理解しようとしています。Caching with Hibernate に関する情報源と Spring に関する情報源を見つけたので、情報をまとめてみました。私はまだ両方のフレームワークにいくつかの質問をしています。誰かがそれらに答えたり、ここにリストされている事実が正しいかどうか教えてくれたらうれしいです.

ほとんどの場合、短い回答 (はい/いいえ) で十分です。このリストは、Spring と Hibernate によるキャッシュがどのように機能するかを理解したい他の人にも役立つと思います。

General

1) Hibernate は次のキャッシュをサポートします: 1st Level Cache、2nd Level Cache、Query Cache

2) Spring 自体は、次のキャッシングの可能性をサポートしています: メソッドキャッシングのみ

1st Level Cache

3) 1st Level Cache は、すべての Hibernate アプリケーションの一部です。

4)休止状態セッションごとに 1 番目のレベルのキャッシュが作成されます。

5)第 1 レベルのキャッシュには何が保存されますか? オブジェクトまたはそれらのプロパティの値だけですか? クエリとその結果?

2nd Level Cache

6)わかったこと: 2nd Level Cache は、アプリケーションごとに 1 回使用されます。それは間違っていませんか?あたり1回使用されていませんSessionFactoryか?および: 複数の sessionfactorys = 複数の第 2 レベルのキャッシュが可能ですか?

7)第 2 レベルのキャッシュに保存されるもの: 私の意見では、オブジェクト自体ではなく、1 つのレコードに属する値のみです。

8) 1 つのレコードの値を第 2 レベル キャッシュに格納する場合、関連する値 (外部キーを介して接続されたオブジェクトから) も格納できますか?

9)第 2 レベルのキャッシュ内の 1 つのオブジェクトの値を更新すると、それに接続されているオブジェクトの値もキャッシュ内で更新できますか?

10)オブジェクトの値が変化している場合、どうすれば第 2 レベルのキャッシュを更新できますか? 流す?キャッシュの一部だけを更新できますか、それともキャッシュ全体を更新する必要がありますか?

11)第 2 レベルのキャッシュが意味をなすのはどこで、そうでないのはどこですか?

12)キャッシュ モード: 各キャッシュ モードは異なるキャッシュ戦略を提供しますか? たとえば、キャッシュモードが「読み取り専用」の場合、データベースとキャッシュの同期は必要ありませんか? 他のキャッシュ モードは同期を提供しますか? 同期は開発者自身が行う必要があると思いましたか?

Query Cache

13) Query Cache と 2nd Level Cache の違いは何ですか? 私の意見では、クエリキャッシュの結果セットは保存されますが、値ではなくIDのみで保存されます。クエリが再度使用され、結果セットがまだ「正しい」場合、ID に属する値が 2 次キャッシュからクエリされます。

14)クエリ キャッシュには、第 2 レベルのキャッシュを使用する必要がありますか?

15) Query Cache はどこで意味があり、どこで意味がないのですか?

Spring

16) Spring はメソッドキャッシングよりも多くのキャッシングの可能性を提供しますか?

17)メソッドキャッシングはハイバネートキャッシングにリンクされていません

18)ただし: メソッドのキャッシングには、Ehcache のような第 2 レベルが必要です (hibernate でも使用できます)。

19)データベースクエリなしでメソッドキャッシングを使用できますか?

Getting mixed up

20) hibernate に ehcache を第 2 レベル キャッシュとして使用し、Spring に Ehcache をメソッド キャッシングに使用する場合、同じ Ehcache-instance を使用できますか? 何かが混じる可能性はありますか?

21) 1 次キャッシュと 2 次キャッシュを使用する場合、それらを混同することはできますか? データベースにクエリを実行するとき、結果はどこから来るのでしょうか? 1 番目または 2 番目のレベルのキャッシュですか? 第 1 レベルのキャッシュは第 2 レベルのキャッシュで動作しますか?

22)私が言及したキャッシュを使用することで混乱する可能性のあるものは他にありますか? :-)

どんな質問にも答えてくれてありがとう!:-)

4

2 に答える 2

78

Hibernate は次のキャッシュをサポートします: 1st Level Cache、2nd Level Cache、Query Cache

はい。

Spring 自体は、次のキャッシングの可能性をサポートしています。メソッド キャッシングのみ

Spring 3.1 では、メソッドに関するアノテーションに基づく新しいキャッシングの抽象化が導入されています。

1st Level Cache は、すべての Hibernate アプリケーションの一部です。

はい。

第 1 レベルのキャッシュは、休止状態セッションごとに作成されます。

はい。ただし、いつでも手動でクリアできます。

1st Level Cache には何が保存されますか? オブジェクトまたはそれらのプロパティの値だけですか? クエリとその結果?

これは、セッションの存続期間中にフェッチされたすべてのオブジェクトのマップです。同じオブジェクトを id で 2 回目にロードすると、L1 からロードされます。

わかったこと: 2nd Level Cache は、アプリケーションごとに 1 回使用されます。それは間違っていませんか?セッションファクトリーごとに1回使用されていませんか?および: 複数の sessionfactorys = 複数の第 2 レベルのキャッシュが可能ですか?

その通りです。通常、アプリケーション (データベース) ごとに 1 つのセッション ファクトリしかないため、ショートカットが作成されます。

第 2 レベルのキャッシュに保存されるもの: 私の意見では、オブジェクト自体ではなく、1 つのレコードに属する値のみです。

L1と同じですが、長生きします。通常、L2 は強力なキャッシュによって支えられていますが、L1 は単なるマップです (スレッドセーフである必要さえありません)。遅延ロードされた関係を含む完全なエンティティを格納します。

1 つのレコードの値を第 2 レベル キャッシュに格納する場合、関連する値 (外部キーを介して接続されたオブジェクトから) も格納できますか?

L2 を手動で管理するのではなく、自動的に行われます。

第 2 レベルのキャッシュ内の 1 つのオブジェクトの値を更新すると、それに接続されているオブジェクトの値もキャッシュ内で更新できますか?

上記を参照。

オブジェクトの値が変化している場合、2 次キャッシュを更新するにはどうすればよいですか? 流す?キャッシュの一部だけを更新できますか、それともキャッシュ全体を更新する必要がありますか?

上記を参照してください - Hibernate がこれを解決します。L2 と直接対話することはありません。

第 2 レベルのキャッシュはどこで意味があり、どこで意味がないのですか?

測定。主キーによって大量のデータを読み取り、読み取りから書き込みへのファクターが非常に高いアプリケーションでは、L2 がパフォーマンスに大きな影響を与えます。

キャッシュ モード: 各キャッシュ モードは異なるキャッシュ戦略を提供しますか? たとえば、キャッシュモードが「読み取り専用」の場合、データベースとキャッシュの同期は必要ありませんか? 他のキャッシュ モードは同期を提供しますか? 同期は開発者自身が行う必要があると思いましたか?

キャッシュ モードは、Hibernate がキャッシュと無効化のための最適な戦略を選択するのに役立ちます。たとえば、キャッシュが読み取り専用の場合、Hibernate はそれを無効にすることはありません (または、それほど頻繁には行いません)。ただし、読み取り専用キャッシュ (読み取り専用エンティティ) はもちろん更新を禁止します。

クエリ キャッシュと 2 次キャッシュの違いは何ですか? 私の意見では、クエリキャッシュの結果セットは保存されますが、値ではなくIDのみで保存されます。クエリが再度使用され、結果セットがまだ「正しい」場合は、ID に属する値が 2 次キャッシュからクエリされます。

その通りですが、これは非常に幅広いトピックです。特に結果セットはまだ「正しい」部分です。

クエリ キャッシュには、第 2 レベルのキャッシュを使用する必要がありますか?

はい、L2 キャッシュがなければ、クエリ キャッシュは意味がなく、アプリケーションの速度が大幅に低下します。

クエリ キャッシュはどこで意味があり、どこで意味がないのでしょうか?

難しい質問です。通常、同じクエリを何度も実行していて、クエリ パラメータの数が少ない場合 (クエリ パラメータのセットごとに、新しいクエリ キャッシュが作成され、レコードのすべての ID が結果になります)。

Spring は、メソッド キャッシングよりも多くのキャッシングの可能性を提供しますか?

いいえ、Spring は多かれ少なかれ、独自のコードの接着剤にすぎません。

メソッドのキャッシングは休止状態のキャッシングにリンクされていません。

SpringはHibernateにリンクされていないので...

ただし、メソッドキャッシングには、ehcache (休止状態でも使用できる) のような第 2 レベルが必要です。

L2 は休止状態の概念です。メソッドをキャッシュしたい場合は基礎となるキャッシュが必要です。気にしないで、EhCache にしましょう。もちろん、スレッドセーフでなければなりません。

データベースクエリなしでメソッドキャッシングを使用できますか?

春は休止状態とは何の関係もありません。データベースとは関係のない計算をキャッシュすることができます。

hibernate に ehcache を第 2 レベル キャッシュとして使用し、Spring に ehcache をメソッド キャッシングに使用する場合、同じ ehcache-instance を使用できますか? 何かが混じる可能性はありますか?

展開を容易にするために、Hibernate と同じCacheManagerキャッシュ構成を使用できます。キャッシュ名が重複しない限り、同じマネージャー内で動作することを考えても、それらは完全に独立しています。

1 次キャッシュと 2 次キャッシュを使用する場合、それらが混同される可能性はありますか? データベースにクエリを実行するとき、結果はどこから来るのですか? 1 番目または 2 番目のレベルのキャッシュですか? 第 1 レベルのキャッシュは第 2 レベルのキャッシュで動作しますか?

一部の抽象化が漏れない限り、それらは機能します:-)。主キーでクエリを実行すると、最初に L1 が調べられ (より高速です)、次に L2 が調べられます。

私が言及したキャッシュを使用することで混乱する可能性のあるものは他にありますか? :-)

上記を参照してください。抽象化はリークする傾向があります。しかし、最悪の問題は、データベースを変更し、Hibernate がそれを認識していない場合に発生します。また、適切なレプリケーションなしでクラスタリングすると、頭痛の種になります。そして最大の問題 - 非常に頻繁に不適切なキャッシングが実際にアプリケーションの速度を低下させます (クエリ キャッシュはここで最も危険です)。

于 2011-03-23T13:30:23.377 に答える
2

Spring と 2 番目のレベルのキャッシュに関しては、Spring が 2L キャッシュで動作するのに役立つクールなオープン ソース プロジェクトがあります。

例: http://code.google.com/p/ehcache-spring-annotations/

私たちはそれを本番環境で使用しており、私たちの生活がずっと楽になります。

于 2011-03-23T12:57:19.430 に答える