HQL
クエリが情報を取得する場所を理解する上で問題があります。私のプロジェクトは異なるスレッドを使用しており、各スレッドはデータベースに対して読み書きを行っています。スレッドはセッションオブジェクトを共有しません。代わりに、セッションを作成するHibernateUtil
クラスを使用しています。Hibernate HQLはセッションキャッシュにのみヒットする
最近まで、私は書いた後だけセッションを終了しましたが、読んだ後では終了しませんでした。オブジェクトへの変更は、データベースではなく、で他のスレッド(書き込みに使用されたものとは異なるセッションオブジェクト)で読み取ると直ちに表示されます。読み書きは常に異なるスレッド上で起こりました。これは異なるセッションオブジェクトと異なるセッションキャッシュを意味します。
私はいつもCriteria
の代わりにHQL
を使用して、セッションキャッシュではなくデータベース(またはセカンドレベルのキャッシュ)をターゲットにしていたと思いますが、コードをデバッグするときにHQLが探していたことがわかりました。セッションキャッシュ内のオブジェクトを取得し、古くなった古いオブジェクトを取得しました。
HQL
は常にデータベースを対象としていると仮定して間違っていましたか?または少なくとも第2レベルのキャッシュ?
PS:私はSessionFactory
オブジェクトを1つだけ使用しています。
私のセッションオブジェクトが初めてデータベースをターゲットとするHQLクエリを実行するときです。結果はセッションキャッシュに格納されます。 2回目に同じHQLクエリを実行すると、データベースを対象とするのではなくキャッシュが読み込まれます。これがデフォルト動作です。私はこれを正しく理解していますか? ** ps:**実際、各読み書き後のセッションを閉じます(短いセッションの 'Session'オブジェクト)が私の問題を解決します。 – alegen
@alegen:HQLは毎回データベース*に対して実行されますが、そのクエリの最終結果であるJavaオブジェクトはセッションキャッシュから取得される可能性があります。これがデフォルト動作です。 – skaffman
あなたは素晴らしい一日を過ごしています!あなたの答えをありがとう:) – alegen