хранение отсортированного списка внутри ehcache - PullRequest
1 голос
/ 03 августа 2011

Я новичок в ehcache и не могу найти именно то, что мне нужно.

Я использую hibernate и у меня есть одна большая таблица (500k + элементов), которая мне нужна для быстрого запроса.

Пользователь требует пересмотра этой таблицы на страницах, отсортированных по 4 различным атрибутам. Я хотел предварительно отсортировать эту таблицу и сохранить ее в 4 разных кэшированных списках. У пользователя также есть возможность поиска по этой таблице.

Как я могу это сделать? Я хотел бы, чтобы данные были предварительно извлечены и обновлены из базы данных автоматически.

Ответы [ 2 ]

0 голосов
/ 04 августа 2011

500K записей - это не большая таблица.

Вероятно, вы получите максимальную производительность от этого путем адекватной настройки вашей базы данных (и базовой ОС) так, чтобы ваша таблица и необходимые индексы помещались (и оставались в) на стороне DB кеша.

Кэш 2-го уровня Hibernate + кэш запросов здесь не сильно поможет, особенно с изменяемыми данными, которые нужно разбивать на страницы и сортировать различными способами.

0 голосов
/ 03 августа 2011

Интересный вопрос, на самом деле 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 КиБ, сохранение всей базы данных в памяти может быть целесообразным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...