JPA фоновое обновление кеша - PullRequest
8 голосов
/ 15 апреля 2011

У нас есть высокопроизводительное промежуточное программное обеспечение на Java (J2SE), где задержка имеет первостепенное значение.Он использует некоторые постоянные данные, хранящиеся в устаревшей базе данных, где устаревшее приложение может случайно изменить данные.Из-за требований к задержке мы планируем кэшировать постоянные данные, используя JPA с Hibernate и, возможно, провайдер кеша, такой как Ehcache.

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

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

Возможно ли это с Ehcache?Я видел SelfPopulationCache и CacheLoader, но похоже, что я делаю много работы (мне пришлось бы писать код вручную для каждой сущности).Также у кого-нибудь есть пример реализации CacheLoader?Я надеялся на возможность асинхронного обновления в Query Cache.

Существуют ли какие-либо другие технологии, которые могли бы предоставить решение?Мы не связаны провайдером JPA или провайдером кэша.

Может ли Spring @Cacheable предоставить решение?Я видел, что spring ehcache cachable упоминает самозаполняемый-cache-scope, но мне не ясно, что это значит.

Заранее спасибо.

Ответы [ 3 ]

5 голосов
/ 07 мая 2012

Какую базу данных вы используете?

EclipseLink 2.4 обеспечит функцию аннулирования кэша, управляемого событиями базы данных. Это интегрировано с базой данных Oracle DCN / QCN. Вы также можете подключить что-то с помощью триггеров.

http://wiki.eclipse.org/EclipseLink/Examples/JPA/DCN

Вы также можете изучить Oracle GoldenGate, Coherence и TopLink Grid.

1 голос
/ 11 мая 2012

Я не знаю, как это сделать, используя EhCache или другой компонент, но общий подход к этой проблеме - «иметь 2 кэша». Позвольте мне объяснить: у вас есть один кеш, обслуживающий ваше приложение с данными (в этом кеше не будет обновлений при обслуживании приложения), и еще один кеш, созданный временным работником с самыми последними данными (вы можете создавать кеш каждые x секунд или каждый раз вы получите событие, сообщающее, что ваши данные изменились). Когда ваш новый кеш заполнен, вы заменяете старый кеш на новый, поэтому ваш недавно обновленный кеш теперь обслуживает приложение с 0 задержками кеша. Как вы можете видеть, проблема этого подхода заключается в том, что ваш клиент может видеть устаревшие данные, пока ваш новый кэш не заполнен. И, конечно, это очень дорогой метод (у вас очень часто будет 2 кеша в памяти, и вы тоже будете часто создавать новый кеш).

1 голос
/ 15 апреля 2011

Если вы можете изменить устаревшее приложение, то одним из вариантов является отправка уведомлений о недействительности кэша с чем-то вроде ActiveMQ . Если вы не можете изменить унаследованное приложение, другой вариант - добавить в таблицу индексированный столбец меток времени / строк и периодически опрашивать его на предмет изменений со времени предыдущего опроса.

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