Интересный вопрос, на самом деле Hibernate предоставляет все необходимое из коробки, однако механика немного сложна.Прежде всего вам нужен кэш второго уровня (L2).Он сохраняет каждую запись как отдельный элемент по идентификатору.Это означает, что вы можете легко запрашивать ваши объекты по идентификатору, не касаясь базы данных.
Это само по себе вам не поможет, и вот тут-то и вступает в игру кеш запросов .Предположим, у вас есть запрос, подобный следующему:
SELECT c1, c2, c3, c4
FROM table
ORDER BY c1 ASC
LIMIT 100,20
При первом выполнении этого запроса Hibernate запустит его для базы данных, но также сохранит все возвращенные записи в L2 и сохранит сам результат.(список идентификаторов) в кеше запросов.В следующий раз, когда вы выполните точно такой же запрос, Hibernate найдет список идентификаторов в кэше запросов и затем извлечет каждую запись одну за другой из L2.
Если вы используете немного другой запрос, Hibernate запустит SQL и сохранитрезультат под другим ключом.Он использует отдельный кеш для кеша запросов, а ключ формируется путем объединения запроса и всех параметров.
Я не уверен, будет ли Hibernate сохранять полный результат в кеше и будет применять пейджинг в памяти или, возможно, он будет хранить отдельные страницыотдельно, поэтому каждый запрос будет иметь в кэше столько элементов, сколько возможно различных страниц.Если вы пойдете этим путем, было бы замечательно, если бы вы могли меня просветить.
Также обратите внимание, что любое изменение, сделанное для любой строки в этой таблице через Hibernate, приведет к аннулированию all кешируются запросы с участием этой таблицы.Кстати 500K не такой большой стол ;-).Если каждая запись занимает 1 КиБ, сохранение всей базы данных в памяти может быть целесообразным.