2009-10-19 4 views
3

У меня есть веб-сайт, который позволяет искать списки контента различными способами, например «показать материал, созданный пользователем 523, заказанный по дате», или «показать список из последних 10 сообщений».caching spring/hibernate webapp

Я использую Hibernate для своего ORM, а Hibernate предоставляет кэш для объектов. Тем не менее, для списков объектов, как и список первой страницы самого последнего контента, я не понимаю, как лучше всего кэшировать этот контент. Прямо сейчас у меня есть контроллеры Spring, которые просто возвращают стандартную страницу JSP, а затем я использую oscache на уровне JSP, обернутый вокруг вызова другому классу.

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

Какие у меня варианты?

ответ

3

Вы хотите, чтобы кешировать результаты спящих запросов в дополнение к сущностям? Если да, то вам нужно посмотреть query caching.

+0

Не совсем. Кэширование запросов кажется опрятным, но также ограниченным и склонным к частому промыванию во многих ситуациях. Я надеялся каким-то образом кэшировать произвольные вызовы в DAO в более общем плане, но я уверен, что это именно то, что я хочу. Я просто задаюсь вопросом, есть ли какие-то стандартные методы, о которых я не знаю. Например, что может использовать переполнение стека для рендеринга своей главной страницы, или каждый визит запускает чтение базы данных? –

+0

Я думаю, что вы можете выполнять кеширование запросов на плохую службу, я не нашел его ограниченным, и его очистка слишком часто, тогда ему нужно настроить и настроить, как и любую технологию кеширования. – skaffman

0

Для этого кэширования, Hibernate разбивает задачу на двух уровнях:

  1. Список идентификаторов, которые соответствуют запросу: этот результат может изменяться во многих отношениях. Например, если какая-либо из таблиц, используемых в запросе, будет изменена, результат может быть изменен. Независимо от того, будет ли оно эффективно изменено, будет сложно вычислить и поддерживать актуальность, поэтому в большинстве случаев он неэффективен. Итак, Hibernate выбирает не кэшировать идентификаторы, соответствующие запросу.
  2. Как только список идентификаторов, соответствующих запросу, известен, также необходимы все данные, соответствующие возвращенным объектам, плюс все объекты (или компоненты), которые извлекаются. Здесь мы предполагаем, что вы решили, что эти сущности являются достаточно постоянными и достаточно читаемыми, чтобы их кэширование было целесообразным. Это извлекает данные из полного кэша Hibernate второго уровня.

Для повышения эффективности кэширования и простоты кода я расщепить такие результаты, которые я хочу, чтобы кэшировать в двух уровнях:

  • запрос возвращая только идентификаторы (плюс, возможно, объекты неправдоподобные, которые не были выбраны для второй уровень кэш Hibernate)
  • других данных, выбранных по идентификатору, чтобы извлечь выгоду из кэша второго уровня