Как использовать Java Spring boot cache - PullRequest
1 голос
/ 10 июля 2020

У меня есть приложение java spring boot. Я хочу использовать кеш для часто читаемых данных. Для этого я включил следующие зависимости в свой jar

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>      
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-cache</artifactId>
    </dependency>

Я также использовал аннотацию @EnableCaching

@EnableCaching 
public class SpringBootConfig {
public static void main(String[] args) throws Exception {
    SpringApplication.run(SpringBootConfig.class, args);    
  }
}

Использовал аннотацию @Cacheable с функцией, которая возвращает данные, которые я хочу cache

@Cacheable(value = "country",key = "'countryCache'+#countryCode")
private Country getCountry(String countryCode) {
    return new Country(countryCode);
}

Но я все еще не могу кэшировать данные. Что-то мне не хватает?

Ответы [ 3 ]

2 голосов
/ 10 июля 2020

вы уже просмотрели Руководство по началу работы для кэширования данных ?

Есть параграф, который объясняет, почему кеш не работает в вашем коде.

Аннотация @EnableCaching запускает постпроцессор, который проверяет каждый компонент Spring на наличие аннотаций кеширования в методах publi c. Если такая аннотация найдена, автоматически создается прокси-сервер для перехвата вызова метода и соответствующей обработки кэширования.

Поскольку ваш getCountry метод равен private, кеширование не будет работать. Может быть, вам разумно кешировать результат вызова метода?

1 голос
/ 10 июля 2020

Перехватываются только вызовы внешних методов, поступающие через прокси. Это означает, что, по сути, самовызов метода внутри целевого объекта, вызывающего другой метод целевого объекта, не приведет к фактическому перехвату кеша во время выполнения, даже если вызванный метод помечен @ Cacheable.

Кроме того, я бы рекомендовал использовать реализацию Ehcache с загрузкой Spring, которая позволяет выполнять условное кэширование. проверьте это сообщение

0 голосов
/ 10 июля 2020

Аннотация @Cacheable доступна только для открытого метода publi c, которому разрешен перехватчик. Но вы можете получить сервисы CacheManager и использовать их в своем коде для внутренней обработки кеша в приватных методах, если это необходимо. Но только для решения некоторых "особых" проблем обычный способ - аннотировать методы publi c.

Также, если вы используете только стартер, вы используете только базовый c и плохую реализацию Spring, простой кеш памяти.

Подумайте о том, как ваше приложение будет работать (отдельное приложение, распределенное приложение, короткий / длинный объем кэшированных данных, ...) и о потреблении памяти, чтобы добавить зависимость любого из поддерживаемых кеш-менеджеры, такие как ehCache, Hazelcast, Caffeine, ... которые соответствуют вашим требованиям и улучшают производительность вашего кеша.

...