сквозной кэш ehcache 3 с загрузкой spring и JPA

#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