2016-07-26 7 views
0

У меня есть класс, который выполняет некоторые операции чтения из службы XXX. Эти операции чтения в конечном итоге выполняют чтение БД, и я хочу оптимизировать эти вызовы, кэшируя результаты каждого метода в классе для заданного настраиваемого ключа для каждого метода.Ошибка автоматического кэширования весной

Class a { 

    public Output1 func1(Arguments1 ...) { 
    ... 
    } 

    public Output2 func2(Arguments2 ...) { 
    ... 
    } 

    public Output3 func3(Arguments3 ...) { 
    ... 
    } 

    public Output4 func4(Arguments4 ...) { 
    ... 
    } 
} 

Я имею в виду использование Spring caching(@Cacheable annotation) для кэширования результатов каждого из этих методов.

Однако я хочу, чтобы кэш-недействительность выполнялась автоматически каким-то механизмом (ttl и т. Д.). Возможно ли это в кэшировании весной? Я понимаю, что у нас есть аннотация @CacheEvict, но я хочу, чтобы выселение произошло автоматически.

Любая помощь будет оценена по достоинству.

ответ

5

Согласно (раздел 36.8) Spring documentation:

Как я могу установить TTL политику/TTI/выселении/особенность XXX?

Непосредственно через поставщика кешей. Абстракция кэша ... ну, абстракция не реализация кэша. Решение, которое вы используете , может поддерживать различные политики данных и различные топологии , которые другие решения не выполняют (например, JDK ConcurrentHashMap) - выявление того, что в абстракции кэша будет бесполезно просто потому, что поддержка поддержки не будет. Такая функциональность должна управляться непосредственно через кэш подложки, при его настройке или через его родной API. @

Это означает, что Spring непосредственно не подвергать API, чтобы установить Time To Live, но вместо этого реле на кэширование поставщика, чтобы установить это. Это означает, что вам нужно либо установить время, чтобы жить через открытый Cache Manager, если поставщик кэширования позволяет динамически настраивать эти атрибуты. Или, альтернативно, вы должны настроить область кэша, которую использует Spring, с аннотацией @Cacheable.

Чтобы найти имя области кеша, которое выдает @Cacheable. Вы можете использовать консоль JMX для просмотра доступных областей кэша в своем приложении.

Если вы используете EHCache, например, когда вы знаете область кэша вы можете предоставить конфигурацию XML, как это:

<cache name="myCache" 
     maxEntriesLocalDisk="10000" eternal="false" timeToIdleSeconds="3600" 
     timeToLiveSeconds="0" memoryStoreEvictionPolicy="LFU"> 
</cache> 

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

REMARK: Поставщик кеша по умолчанию, настроенный Spring, если поставщик кеша не определен ConcurrentHashMap. У него нет поддержки Time To Live. Чтобы получить эту функциональность, вам нужно переключиться на другого поставщика кеша (например, EHCache).

+0

Можете ли вы указать на конфигурацию настройки ttl для базового кэширования Spring? Я не смог найти конфигурацию, связанную с ttl, в документации, представленной в http://docs.spring.io/spring/docs/current/spring-framework-reference/html/cache.html –

+0

Здравствуйте @KumarMrinal. Извините, что разочаровал вы, но кеш по умолчанию, настроенный Spring, это ConcurrentHashMap, который не поддерживает Time Live.Это означает, что вам нужно переключиться на другого провайдера, который поддерживает. EHCache тот, который я уже упомянул выше, является хорошим выбором для поставщика нераспространенных кешей. –

+1

@AlexanderPetrov хороший ответ, что было бы лучше, предоставив ссылку провайдеру кеша (например, EhCache, который вы упомянули в своем ответе), а также ссылку на справочную документацию Spring, из которой вы получили цитату. –

Смежные вопросы