2012-10-22 11 views
6

Hibernateの第2レベルのキャッシュで何らかの明確化が必要です。休止状態の第2レベルのキャッシュを明確にする必要があります

  1. ハイバネート2次キャッシュはどのように機能しますか?

  2. Java EE環境でのサーバー起動時に、エンティティクラスの@Cacheable注釈(休止状態注釈に関して)がある表からすべてのデータをロードしますか?

  3. これらのテーブルに更新があるとキャッシュが同期しますか?

  4. 最後に、DAOコードが更新されたときに通知を受ける方法はありますか? (テーブルの更新を親密にすることができるリスナーを探している)。ここで回答することが広すぎる質問です

答えて

0
  1. いいえ。キャッシュを遅延させる。データベースからキャッシング可能なエンティティを取得するたびに、hibernate APIまたはクエリを使用して、このエンティティがキャッシュに格納されます。後で、キャッシュにあるエンティティのIDとともにsession.get()が呼び出されると、データベースクエリは必要ありません。

  2. 更新がHibernateによって行われた場合、キャッシュが更新されます。外部アプリケーション、SQLクエリ、または一括更新HQLクエリを使用して完了した場合、キャッシュは更新プログラムを認識しません。そのため、キャッシュ可能なエンティティ、選択した生存時間などを注意する必要があります。時には、失効した値を返すことは問題ではなく、時には受け入れられないこともあります。

+0

ありがとうございました。 2回目にIDでクエリを作成した場合にのみ、データベースではなくキャッシュからデータを取得しようとしますか? 私はアプリケーションで "Show_SQL = true"をcfg.xmlファイルに使用しています。これは、同じメソッドを複数回呼び出すたびにクエリを出力します。コンソール上でクエリを表示するだけで、キャッシュからデータを取得できますか? データがフェッチされた場所(データベースかキャッシュかにかかわらず)を確認したりチェックしたりする方法はありますか? –

+0

はい、キャッシュはIDでエンティティにアクセスするときにのみ使用されます( 'session.get()'またはtoOneの関連付けをナビゲート) –

2
  1. どのように二次キャッシュの動作を休止状態にしますか?

    エンティティがキャッシュ可能とマークされ、2番目のレベルのキャッシュが設定されている場合、最初の読み取り後に2番目のレベルのキャッシュにエンティティがキャッシュされます。

    Hibernateは、hibernate仕様に従うキャッシュインプリメンテーションをすべてプラグインする柔軟性を提供します。第2レベルのキャッシュおよび構成オプションの詳細については、Hibernate Manualを参照してください。

  2. Java EE環境でのサーバー起動時のエンティティクラスの@Cacheable注釈(休止状態注釈に関して)がある表からすべてのデータをロードしますか?

    これを達成するための設定はありません。間接的には、起動時にテーブル全体を読み取ることでこれを達成できます。これは、システムの起動時間に悪影響を及ぼす可能性があります。 (私はこれを好まない)。エンティティが外部から変更された場合、休止状態はそれを同期することができず、古いデータを取得することになります。

  3. これらのテーブルの更新があったときにキャッシュが同期しますか?

    キャッシュは、テーブルの更新後すぐに更新されません。更新されたレコードをフェッチするためのその後の呼び出しはデータベースに行き、hibernateはセッションタイムスタンプを使用してこれを内部的に達成します。

  4. 最後に、DAOコードが更新されたときに通知を受ける方法はありますか? (テーブルの更新を親密にすることができるリスナーを探している)。

    いいえ、hibernateはこれをサポートしていません。

+0

詳細な回答ありがとうございます。 更新されたデータをテーブルから読み取って内部的に内部キャッシュを休止状態にするために明示的にcalが必要ですか? 私はアプリケーションで "Show_SQL = true"をcfg.xmlファイルに使用しています。これは、同じメソッドを複数回呼び出すたびにクエリを出力します。コンソール上でクエリを表示するだけで、キャッシュからデータを取得できますか? データがフェッチされた場所(データベースかキャッシュかにかかわらず)を確認したりチェックしたりする方法はありますか? –

+0

SQLが表示されている場合は、SQLを実行しています。 'Session.get()'を呼び出すだけでなく、toOne関連をナビゲートするだけでなく、クエリを実行している場合、クエリ自体がキャッシュ可能でクエリキャッシュが有効でない限り、常にSQLクエリが実行されます。 –

+0

私は自分のアプリケーションでクエリキャッシュを有効にしておらず、主にhqlクエリを使用しています。私は同じメソッドを呼び出すたびにクエリを実行します。つまり、データを取得するたびにデータベースにアクセスすることを意味しますか? しかし、すべての反復で取られた時間を印刷すると、それは減少し続けます。だからこそ、私はデータがDBかキャッシュから取り出されるかどうか混乱しているのです。 –