Отмена срока действия кэша timeToLive в EhCache, если моя база данных не работает? - PullRequest
1 голос
/ 13 января 2012

У меня есть веб-проект Spring 3.0.x, который отображает страницу ссылок для пользователей, и я столкнулся с небольшой загадкой.В настоящее время я использую EhCache 2.1.0 для кэширования своего контента, который представляет собой статический контент, который изменяется примерно один раз в синей луне.Сам контент хранится в базе данных, которая может отключиться, но не повлияет на многие ссылки, отображаемые на странице, и меня не волнует, куда эти ссылки переходят, меня интересует только их отображение.

Моя загадка: как добавить предварительную проверку в timeToLive EhCache, чтобы он проверял базу данных до истечения срока действия кэша?Я хочу, чтобы он проверял базу данных, и если она не работает, пропустите очистку кэша и сбросьте таймер для повторной проверки через timeToLive секунд.

После просмотра документации на ehcache.orgИ, читая их менеджер кеша и слушатели событий кеша , закрепление кеша и расширения кеша , я не смог найти ничего, что помогло бы гарантировать мне способсделать это ... Я начинаю склоняться к тому, чтобы просто установить timeToLive в 0 и реализовать собственную версию timeToLive, но было бы неплохо, если бы я мог просто использовать что-то, уже присутствующее в EhCache.

1 Ответ

0 голосов
/ 29 марта 2012

Я закончил тем, что создал свой собственный сервис обработки истечения срока действия кеша и использовал ehcache. Сервис работает следующим образом:

  • Есть несколько баз данных, которые я использую, у которых есть мой статический контент. Я объявил эти базы данных в перечислении.
  • Затем я создал класс метаданных срока действия кэша, который содержит: (1) ключ кэша, (2) время жизни, (3) время последнего обновления, (4) зависимости базы данных (список значений enum), (5) spring идентификатор компонента, который содержит # 6, (6) определяемое пользователем имя метода истечения срока действия кэша.
  • Я разделил свои вызовы кэшированных методов по базе данных, а через xml я создал бин метаданных для каждого.
  • Во время выполнения каждый из этих bean-компонентов метаданных помещается во внутреннюю карту сервиса cachekey -> bean-компонент метаданных
  • В службе у меня есть методы ping для каждой базы данных, чтобы определить, работают они или нет
  • Затем я отключил timetolive для ehcache, установив для timeToLive значение 0

У этой службы есть собственный метод проверки истечения срока действия кэша, который называется service.checkExpiration (cacheKey). Если срок действия кэша для cacheKey истек, я проверяю каждую из зависимостей bean-компонента метаданных, а если все они активны, я динамически вызываю определяемое пользователем имя метода истечения срока действия кэша.

Итак, в этом и заключается истечение срока службы кэша. Фактическая реализация на стороне пользователя имеет как минимум два маршрута:

  • Вы можете заключить каждый аннотированный вызов метода @Ehcache в метод, который выполняет вызов вышеупомянутой службы. Затем в коде вызова вы вызываете метод-обертку. Это может стать неприятным, если у вас много методов
  • Или вы можете использовать Spring AOP и аннотацию @Before, чтобы подключиться к вызову метода и выполнить вызов проверки срока действия кэша.

Я испытываю последнее, так как это меньше беспорядка, хотя и немного более магическое, что мне не нравится. Пока это выглядит довольно хорошо. Я действительно хотел бы, чтобы ehcache поддерживал какой-то метод предварительного выполнения, хотя, это сэкономило бы мне много времени на разработку этого ... хотя это было бы не так весело :))

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