Почему у меня пропадает кеш в Сервисе с использованием Spring Cache
Я настроил свой кеш следующим образом:
@Configuration
@EnableCaching
public class CacheConfig {
@Bean(name = "caffeineCachingProvider")
public CachingProvider caffeineCachingProvider() {
return Caching.getCachingProvider("com.github.benmanes.caffeine.jcache.spi.CaffeineCachingProvider");
}
@Bean(name = "caffeineCacheManager")
public JCacheCacheManager getSpringCacheManager() {
CacheManager cacheManager = caffeineCachingProvider().getCacheManager();
CaffeineConfiguration<String, List<Product>> caffeineConfiguration = new CaffeineConfiguration<>();
caffeineConfiguration.setExpiryPolicyFactory(FactoryBuilder.factoryOf(new AccessedExpiryPolicy(new Duration(TimeUnit.MINUTES, 60))));
caffeineConfiguration.setCopierFactory(Copier::identity);
cacheManager.createCache("informerCache", caffeineConfiguration);
return new JCacheCacheManager(cacheManager);
}
}
Также у меня есть @Service
который использует это следующим образом:
@Service
public class InformerService {
@CacheResult(cacheName = "informerCache")
public List<Product> getProducts(@CacheKey String category, @CacheKey String countrySign, @CacheKey long townId) throws Exception {
Thread.sleep(5000);
// do some work
}
}
Итак, у меня следующее поведение.
- Когда я вызываю сервисный метод в первый раз, это занимает 5 секунд, а затем выполняется некоторая работа, как и ожидалось.
- Повторный вызов метода с теми же параметрами - > кэширование работает - > немедленно возвращает результат
- Вызов в третий раз с теми же параметрами снова приводит к
Thread.sleep
И снова и снова.
Как это решить? Это проблема прокси? Что я упустил?
1 ответ
Как обсуждалось в комментариях, это была ошибка в адаптере JCache. Спасибо, что сообщили мне об этой проблеме. Я выпустил версию 2.1.0, которая включает это исправление. Этот выпуск также включает более дружественные начальные настройки для CaffeineConfiguration
который вы определили в другом посте.
В то время как основная библиотека тщательно тестируется, адаптеры JCache слишком сильно полагаются на TCK JSR (комплект для тестирования совместимости). К сожалению, этот набор тестов не очень эффективен, поэтому я добавил тесты, чтобы избежать подобных ошибок в будущем.
Эта проблема возникла только в JCache, потому что его версия срока действия не поддерживается базовой библиотекой Caffeine. Кофеин предпочитает использовать дизайн O(1), который с готовностью очищает просроченные записи, используя фиксированную продолжительность. JCache использует отложенное истечение срока действия для каждой записи, и авторы спецификации предполагают, что ограничение емкости используется, чтобы в конечном счете отбросить просроченные записи. Я добавил предупреждение в документацию об этой функции, так как она может быть подвержена ошибкам. Хотя ни одна из других реализаций JCache не выходит за рамки этого, нерешенной задачей является выбор механизма, который поможет смягчить этот недостаток дизайна JCache.
Еще раз спасибо за сообщение об этой проблеме. Как всегда, не стесняйтесь обращаться, если у вас есть какие-либо вопросы или пожелания, чтобы поделиться.