2017-01-24 5 views
3

Hazelcast 3.6.1と一緒にHibernate 3.5.6を第2レベルのキャッシュとして使用しています。私たちには次の問題があります。私たちは、非遅延コレクションを持つHibernateエンティティを持っています。同じノード上の2つの連続するセッションでコレクションに要素を追加すると、コレクション全体が常にデータベースから再読み込みされます。私は、第2レベルのキャッシュは、要素がコレクションから完全に削除されず、別のエントリを追加するたびに再ロードされるのではなく、コレクションに追加されたときに更新されると予想していました。これはHibernateの第2レベルのキャッシュの主な問題ですか、これは私たち側の設定上の問題ですか?無効化の代わりに第2レベルのキャッシュを更新する

+0

これは、キャッシュの容量に関連する可能性があります。あなたはそれを確認しましたか? –

+0

... <生存秒数> 0 0 LRU 5000 25 100 ...

+0

私はそれに応じて設定を変更しましたが、それは動作 –

答えて

0

自分で質問に答えることができると思います。実際には、Hibernateはではなく、コレクションを更新しますが、常に無効にします。私はここで次の説明を見つけました:http://planet.jboss.org/post/collection_caching_in_the_hibernate_second_level_cache

キャッシングセマンティクスとは何ですか?まあ、重要なのは、コレクションがキャッシュ内で決して更新されないということです。それらはキャッシュから無効にされ、その後、別のデータベース読取りの結果として、後に潜在的にキャッシュされる可能性がある。したがって、アプリケーションがGroup.addMember()と呼ばれる場合、Hibernateはそのグループのメンバーシップコレクションをキャッシュから削除します。 JBoss Cacheが第2レベルのキャッシュ実装である場合、その削除はクラスタの周りに伝播されます。コレクションはクラスタ内のすべてのノードのキャッシュから削除されます。

後でアプリケーションがそのグループのメンバーにアクセスする必要がある場合、別のデータベースの読み取りが行われ、メンバーの現在の主キーのセットがキャッシュに入れられます。

0

デフォルトでは、hibernateキャッシュはPKでキーされるため、findAll()を実行すると、findOne(id)を実行するときにhibernateキャッシュは使用されません。

findAll()をキャッシュする場合は、ehcacheと@Cacheアノテーションを使用します。キャッシュに使用するキーに注意してください。 http://www.ehcache.org/documentation/2.8/get-started/key-classes-methods.html

+0

を変更していない私たちが持っている問題は、私たちがに要素を追加したいということです同僚。 Hibernateはそれに要素を追加するために常にコレクション全体をロードします。問題は、コレクションが2番目のレベルのキャッシュから読み込めない場合(これは私の場合はわかりません)、コレクション全体をロードするためにデータベースに常に照会することになります。 –

+0

@JanSchaeferあなたは自分自身でこのキャッシュの役割を果たす必要があります。私は間違っていることが証明されてうれしいですが、私は何度も同じ問題を抱えてきました。 –

関連する問題