データベースエンティティを持つJava/Springアプリケーションがあります。 エンティティの1つはDataSet
です。 各データセットには親を持つことができますDataSet
。 そして、親 - DataSet
には、複数(OneToMany)の子があります。コレクションHibernateを使ったキャッシング
@OneToMany(fetch=FetchType.LAZY)
@IndexColumn(name = "order_id")
@JoinColumn(name = "parent_dst_id")
@Fetch(FetchMode.SELECT)
@Cache(usage = org.hibernate.annotations.CacheConcurrencyStrategy.READ_WRITE)
public List<DataSet> getChildren()
{
return children;
}
数年後、多くのデータセットが親データセットの下でグループ化されました。コード(これは正しい方法であれば、私はよく分からない)親に新しいデータセット(調査)を追加する際に次の行が実行されて
parentDataset.getChildren().size() // > 200.000
:
surveyDataset.setParent(parentDataset);
parentDataset.getChildren().add(surveyDataset);
最近までchildren
はまったくキャッシュされませんでした。 2番目のステートメントは、結果としてデータベースで長時間実行されていました。
最近、私たちはdatasets.children
をキャッシュに追加しました。そうすれば、すべてが本当に速くなります。まで
...
...別の子データセットが追加され、それは再び本当に遅くなる(同じ親の下に!)(すなわち:それは再びデシベルを照会開始)。
私は、キャッシュが追い払われているかどうか、それが何であっても、それが再びクエリを行う理由だと思います。
も参照:http://planet.jboss.org/post/collection_caching_in_the_hibernate_second_level_cache(TLDR: "Hibernateはキャッシュでコレクションを更新しません、それはちょうどそれを削除")
私は(net.sf.ehcache = DEBUGのログを理解しようとしたとorg.hibernate.SQL = DEBUG)しかしそれは難しいです。だから私はいくつかの質問
1にこだわっている
)私は)(再びすべての子-のデータセットをロードする新しいデータセットからすべての兄弟を防ぐために行うには何がありますか? 2)キャッシュに何が起こっているのかをどのようにデバッグできますか?それは親を退去させるか?またはすべての子供ですか?この記事で説明したように、おそらくコレクション全体がリロードされます。
ありがとうございました! 「追放政策を正確に維持する」とはどういう意味ですか? – codesmith
cache usage = "read-write"を指定すると、hibernateはオブジェクトの追い出しを処理します。 session.save/updateを使用してオブジェクトを更新すると、キャッシュからキャッシュされたオブジェクトが削除されます。しかし、Readはこれを行うために休止状態を許可しないため、プログラムでキャッシュ追い出しをコードに書き込んで処理する必要があります。 – user1622369