web-dev-qa-db-ja.com

Hibernate + Springでのキャッシュ-いくつかの質問

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

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

General

1) Hibernateは次のキャッシュをサポートします:1次レベルキャッシュ、2次レベルキャッシュ、クエリキャッシュ

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

1st Level Cache

1次キャッシュは、すべてのHibernateアプリケーションの一部です。

4)すべてのhibernate-sessionに対して1次キャッシュが作成されます。

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

2nd Level Cache

6)わかった:2次キャッシュは、アプリケーションごとに1回使用される。それは間違っていませんか? SessionFactoryごとにONCEを使用していませんか?そして:複数のセッションファクトリー=複数の2次キャッシュが可能ですか?

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

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

9) 2番目のレベルのキャッシュ内の1つのオブジェクトの値を更新するときに、それに関連付けられているオブジェクトの値もキャッシュ内で更新できますか?

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

11) 2次キャッシュはどこで意味があり、どこで意味がないのですか?

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

Query Cache

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

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

15)クエリキャッシュはどこに意味があり、どこに意味がないのですか?

Spring

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

17)メソッドキャッシングは休止キャッシングにリンクされていません

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

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

Getting mixed up

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

21) 1次キャッシュと2次キャッシュを使用すると、混同する可能性がありますか?データベースをクエリするとき、結果はどこから来ますか、1次または2次キャッシュ? 1次キャッシュは2次キャッシュと連携しますか?

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

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

62
nano7

Hibernateは次のキャッシュをサポートします:1次キャッシュ、2次キャッシュ、クエリキャッシュ

はい。

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

Spring 3.1では、メソッドに関する注釈に基づいた新しいキャッシング抽象化が導入されています。

1次キャッシュは、すべてのHibernateアプリケーションの一部です。

はい。

1次キャッシュは、すべての休止状態セッション用に作成されます。

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

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

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

私が見つけた:2次キャッシュはアプリケーションごとに1回使用されます。それは間違っていませんか?セッションファクトリーごとに一度使用されていませんか?そして:複数のセッションファクトリー=複数の2次キャッシュが可能ですか?

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

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

L1と同じですが、長生きします。 L1は単なるマップですが、L2は通常、何らかの産業用キャッシュによってサポートされています(スレッドセーフである必要はありません)。遅延読み込みされた関係を含む完全なエンティティを格納します。

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

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

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

上記を参照。

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

上記を参照-Hibernateがこれを理解します。 L2と直接やり取りすることはありません。

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

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

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

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

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

確かに、これは非常に広範なトピックです。特に結果セットは「正しい」の部分です。

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

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

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

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

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

いいえ、Springは多かれ少なかれ、独自のコードの単なる接着剤です。

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

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

しかし:メソッドキャッシングには、ehcache(Hibernateでも使用できます)のように第2レベルが必要です。

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

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

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

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

デプロイメントを容易にするために、Hibernateと同じCacheManagerおよびキャッシュ構成を使用できます。キャッシュ名が重複しない限り、それらは完全に独立しており、同じマネージャー内で機能しているとさえ考えられます。

1次キャッシュと2次キャッシュを使用する場合、それらは混同される可能性がありますか?データベースをクエリするとき、結果はどこから来ますか、1次または2次キャッシュ? 1次キャッシュは2次キャッシュと連携しますか?

抽象化が漏れない限り、それらは機能します:-)。主キーでクエリする場合、最初にL1が検査され(より高速です)、次にL2が検査されます。

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

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

74

Springと2次キャッシュについては、2Lキャッシュで動作するようにSpringをヘルパーできるクールなオープンソースプロジェクトがあります。

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

私たちはそれを本番環境で使用しており、私たちの生活をはるかに簡単にします。

2
danny.lesnik