2016-12-27 11 views
0

データベースエンティティを持つ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_cacheTLDR: "Hibernateはキャッシュでコレクションを更新しません、それはちょうどそれを削除")

私は(net.sf.ehcache = DEBUGのログを理解しようとしたとorg.hibernate.SQL = DEBUG)しかしそれは難しいです。だから私はいくつかの質問

1にこだわっている

)私は)(再びすべての子-のデータセットをロードする新しいデータセットからすべての兄弟を防ぐために行うには何がありますか? 2)キャッシュに何が起こっているのかをどのようにデバッグできますか?それは親を退去させるか?またはすべての子供ですか?この記事で説明したように、おそらくコレクション全体がリロードされます。

答えて

0
  1. cache usage = "read-write"をcache usage = "read-only"に変更して、コード内に追い出しポリシーを維持することができます。これはキャッシュを管理する最も安全な方法ですが、キャッシュを管理するためのコードをかなり持ち上げる必要があります。

  2. デバッグには2通りの方法があります。

    1. は通常、Hibernateはオブジェクトのために最初にキャッシュをチェックしようとしましたが、見つけると2番目のクエリデータベースの道を送っていなかったことを示していた、休止状態にshow_sqlを有効にし、クエリが2回実行取得されているかどうかを確認します。この記事で説明したよう
    2. ログキャッシュヒット:http://winterbe.com/posts/2009/10/01/how-to-log-hibernate-cache-this/
+0

ありがとうございました! 「追放政策を正確に維持する」とはどういう意味ですか? – codesmith

+0

cache usage = "read-write"を指定すると、hibernateはオブジェクトの追い出しを処理します。 session.save/updateを使用してオブジェクトを更新すると、キャッシュからキャッシュされたオブジェクトが削除されます。しかし、Readはこれを行うために休止状態を許可しないため、プログラムでキャッシュ追い出しをコードに書き込んで処理する必要があります。 – user1622369

関連する問題