4

誰でもこの質問を解決するのを手伝ってくれますか? Infinispan を二次キャッシュとして使用し、Hibernate を ORM として使用しています。enityt とクエリ キャッシュの両方をオンにしました。

たとえば、Q1 は「BokkEntity b からの selet b where b.id < 5」であり、Q2 のような別のクエリは「select b from BokkEntity b where b.id < 7」
です。初めて Q1 を実行すると、5 がロードされます。永続ストアからキャッシュへのオブジェクト。2 番目のクエリを初めて実行すると、7 つのオブジェクトがキャッシュに読み込まれます。最初の 5 つのオブジェクトは両方のクエリで共通です。そして、私の理解によると、クエリ キャッシュは常に ID を格納するだけであり、エンティティ キャッシュがオンになっている場合、クエリ キャッシュ内の ID によって参照されるオブジェクトのキャッシュ内で検索が行われます。

したがって、私の質問は、Q2 (q1 の実行後) を初めて実行しているときに、両方の Q2 がすべてのオブジェクトを再度読み込み、エンティティ キャッシュでこれらを上書きする理由です。

クエリキャッシュが後続のリクエストに対して適切に機能していることを確認しました。つまり、Q1 または Q2 を再実行すると、データはキャッシュからアクセスされます。

これは緊急です。努力に感謝します。

ありがとう

ミーナ

4

1 に答える 1

1

Hibernate は、以前にまったく同じクエリを実行したことがない限り、クエリのどの結果が既にあるかを知る方法がありません。したがって、これは予期される動作です。

Hibernate のドキュメントによると:

同じパラメーターを使用して何度も実行されるクエリがある場合、クエリ キャッシュによってパフォーマンスが向上します。

フレーズに注意してください: with the same parameters

ID でエンティティを取得するよう hibernate に要求している場合、キャッシュを簡単に検索できます。ただし、以前に実行されたことのないクエリでは、最後の実行以降に任意の数が挿入されている可能性があります (サーバー間で無効化されるだけで、リモート サーバー キャッシュの追加や更新は行われません)。

また、クエリの場合、hibernate はクエリ キャッシュを無効にすることに積極的です (良いことです) (データベースの更新が発生するたびに、キャッシュされたすべてのクエリ結果が失われる可能性があります)。

2 つのクエリをマージおよび分割できるようにするために実装する必要があるロジックの種類は非常に複雑であり、データベース構造とプログラム ロジックに関する詳細な知識がなければ不可能である可能性があります。

于 2013-06-01T04:43:46.943 に答える