興味深い質問ですが、実際にはHibernateは必要なものすべてを提供しますが、その仕組みは少し複雑です。まず第2レベルのキャッシュ(L2)が必要です。各レコードをidで単一項目として格納します。つまり、データベースに触れることなく簡単にIDでオブジェクトを照会することができます。
これだけでは役に立ちません。クエリキャッシュが出場しています。 (リストを
SELECT c1, c2, c3, c4
FROM table
ORDER BY c1 ASC
LIMIT 100,20
このクエリを実行する最初の時間は、Hibernateはデータベースに対してこのコマンドを実行しますが、それはまた、L2に返されたすべてのレコードを格納し、結果そのものを保存します:あなたは、これに似たクエリを持っていると仮定ids)をクエリキャッシュに格納します。次に正確に同じクエリを実行すると、Hibernateはクエリキャッシュ内のidのリストを見つけて、次にL2からそれぞれのレコードを1つずつフェッチします。
少し異なるクエリを使用する場合、HibernateはSQLを実行し、その結果を別のキーの下に格納します。クエリキャッシュ用に別のキャッシュを使用し、クエリとすべてのパラメータを連結してキーを形成します。
Hibernateが完全な結果をキャッシュに保存してメモリにページングを適用するかどうか、あるいは単一のページを別々に保存するかどうかはわかりませんので、各クエリはキャッシュ内の要素数が多く、あなたがこのように行くなら、あなたが私を啓発することができれば素晴らしいだろう。
も休止を経て、この表にに任意の行を行って何らかの変更がすべてキャッシュされたが、このテーブルを含むクエリを実行無効になることに注意してください。 BTW 500Kはそれほど大きなテーブルではありません;-)。各レコードが1 KiBを占める場合、データベース全体をメモリに保持する価値があります。
私はehcacheを通じて2番目のレベルのキャッシュで遊んでいましたが、必要なパフォーマンスを提供していません。各ユーザーのクエリ自体は異なります。データは読み取り専用でもありません。 1日に約1-2回更新されます。私は最初のヒットが遅くなることを望まないので、データをプリフェッチしたいのです。情報のおかげで – kgibbon