同じテストメソッドでデータベースから結果を2回フェッチするために同じクエリを使用する必要がある単体テストクラスを作成しようとしています。ただし、Hibernateキャッシュは2回目に有効になるため、実際にはデータベースにアクセスせず、キャッシュから結果を取得するだけです。
誰かがキャッシングを無効にする方法を答えてくださいpersistence.xml
。
プロパティを変更して無効にしようとしましたhibernate.cache.use.query_cache = false
およびhibernate.cache.use_second_level_cache = false
。
しかし、うまくいきませんでした。
Persistence.xmlでキャッシュを無効にする方法を誰かに答えてください。
2次キャッシュとクエリキャッシュはデフォルトで無効になっています(クエリはexplicitlyキャッシュしない限りキャッシュされません)。一次キャッシュを無効にすることはできません。
プロパティを変更して無効にしようとしました(...)
これにより、2次キャッシュとクエリキャッシュが無効になり、if有効になります。
しかし、うまくいきませんでした。
正直に言うと、「うまくいきませんでした」は、現在の動作と予想される動作の非常に不十分な説明です。より詳細な(擬似)コードを提供すると、SQLトレースがおそらく役立つでしょう。
つまり、質問がHQLに関するものである場合、HQLクエリは、後続の実行時に(クエリキャッシュなしで)データベースに確実にヒットする必要があります。これを監視する必要がある場合は、SQLログをアクティブにします。
質問がSession#get()
またはSession#load()
に関するものである場合、Session#refresh()
を使用してエンティティの状態をリロードするか、Session#clear()
を呼び出して完全にクリアすることができます。セッション。
Hibernateには2つのレベルのキャッシュがあります。
セッションキャッシュ(一次キャッシュ)はデフォルトのキャッシュであり、無効にするメカニズムはありません。
SessionFactory(第2レベル)レベルのキャッシュ:cache_providerを設定して、Hibernate cfgファイルでこれを構成する必要があります。
DBから大量のデータをロードする必要があり、次の機能のためにステートレスセッションを使用しました。
a. Stateless session does not support session cache and never interact with
second level cache.
b. Stateless session does not support automatic dirty check.
c. Stateless session does not support cascading to associated entities.
ステートレスセッションを作成する構文:
StatelessSession statelessSession = sessionFactory.openStatelessSession();
次を使用できます。
session.setCacheMode(CacheMode.IGNORE)
あなたの後:
session.createQuery("from Table")
ステートメント。
これにより、Hibernateがこのクエリによって返されるエンティティの2次キャッシュと対話しないことが保証されます。
StatelessSessionを使用します。
http://docs.jboss.org/hibernate/core/3.6/reference/en-US/html/batch.html
ユニットテスト内で新しい(異なる)セッションを作成すると、古いセッションのキャッシュは「使用されません」。または、最初にclear()を呼び出す場合(別のオプション)など。
Hibenrateチームの男によると:
2次キャッシュは、1次キャッシュ(セッションコンテキストまたは永続コンテキスト)とは関係ありません。永続コンテキスト/セッションキャッシュは、さまざまな理由で必須です。実際、この重要な部分を理解せず、アプリケーションアーキテクチャでそれを無視することは、災害のレシピです。ここには簡単な解決策はありません。ドキュメントを調べてください。
ソース:https://forum.hibernate.org/viewtopic.php?p = 2383408
同じクエリを再試行する前に、seesion.evict(オブジェクト)を使用できます。
最初に結果をクエリした後、session.clearを呼び出すと、同じクエリがレベル1キャッシュではなくデータベースにヒットします