#java #spring-boot #spring-data-jpa #ehcache
#java #весенняя загрузка #spring-data-jpa #ehcache
Вопрос:
- версия spring boot: 1.4.1.RELEASE
- версия ehcache: 3.1.3
- ОС: mac 10.11.6
- java: 1.8.0_91
Я последовал примеру «Caching 101» с Луи Жакометом и Орелиеном Бросзниовски, чтобы разобраться с сквозным кэшированием с помощью ehcache 3.
В этой презентации есть несколько вещей, которые не рассматриваются (но упоминаются кратко). Одним из них является управление ключами кэша, которое теперь становится обязанностью приложения; поскольку созданные объекты / данные кэшируются 1-й раз, если они сохраняются (весь смысл сквозного кэширования), у нас нет доступного нам сгенерированного в БД «идентификатора», который возвращается (JPA)… мы должны добавить новое поле в объект для хранения этого ключа кэша.
Итак, я создал «генератор ключей», который поддерживает набор длинных ключей кэша. Отлично. Но, когда приложение останавливается, этот набор исчезает. Итак, если во время работы приложения были созданы какие-либо объекты / записи, сохраненные в БД, при запуске эти записи необходимо вставить в кэш приложения, а также необходимо заполнить ключ кэша (Set).
В моем примере кода мой контроллер rest — это тот, кто взаимодействует с кэшем, и я добавил метод для достижения этой цели. Он вызывает repository.findAll() для заполнения списка объектов (в данном случае продукта). Поскольку каждый ранее сохраненный объект также сохранял ключ кэша, я перебираю этот список и заполняю кеш; или я так думаю.
@PostConstruct
private void initializeCacheFromDB() {
List<Product> productList = new ArrayList<>();
repository.findAll().forEach(productList::add);
for (Product product : productList) {
// update the cache
// NOTE: below has no effect!
productCache.put(product.getCacheKey(), product);
// update/set the keys
CustomKeyGenerator.addKey(product.getCacheKey());
}
// does nothing!!!! ... no entries so keys not associated w/ Product(s)
//productCache.getAll(CustomKeyGenerator.getKeysSet());
System.out.println("done w/ initializeCacheFromDB()");
}
Но, когда, после того, как консоль подтвердит, что приложение. началось, я перехожу к конечной точке rest, чтобы получить указанный список, он пуст!
Итак, мой вопрос в том, как заполнить кеш при запуске любыми сохраненными данными.
Ответ №1:
Используйте загрузчик
BootstrapCacheLoader См. http://www.ehcache.org/documentation