Hibernate のセカンド レベル キャッシュに関していくつかの混乱があります。私が読んだことのうち、Hibernate のセカンド レベル キャッシュは ID のみを保存し、ID クエリによるルックアップの場合にのみ有益です。結合が行われる両方のテーブルの ID がキャッシュされますか? これをテストするプログラムを実行したところ、キャッシュを有効にすると、結合クエリにより多くの時間がかかることがわかりました。
ありがとう!
Hibernate のセカンド レベル キャッシュに関していくつかの混乱があります。私が読んだことのうち、Hibernate のセカンド レベル キャッシュは ID のみを保存し、ID クエリによるルックアップの場合にのみ有益です。結合が行われる両方のテーブルの ID がキャッシュされますか? これをテストするプログラムを実行したところ、キャッシュを有効にすると、結合クエリにより多くの時間がかかることがわかりました。
ありがとう!
2 番目のレベルのキャッシュは、エンティティの状態をキャッシュし、ID でインデックスを付けます。しかし、それはキャッシュです。一部のエンティティ (通常は最近使用されたもの)のみが格納されます。
したがって、Hibernate がクエリを解析して分析できたとしても、エンティティ ID に関する制限のみが含まれていることに気付きます。キャッシュを使用してデータベースをバイパスすることはできません。データベースがキャッシュにあるかどうか。そのため、すべてを実行するわけではなく、他のクエリと同様にクエリを実行するだけです。
ただし、できることは、クエリ キャッシュを構成することです。これにより、以前に実行されたクエリによって返されたエンティティの ID がキャッシュされます。その場合、同じクエリ (同じ引数を使用) の 2 回目の実行はバイパスされ、ID はクエリ キャッシュから返され、状態は第 2 レベルのキャッシュから読み込まれます。