Кэширование В Spring Framework 3.1

Могу ошибаться, но мне кажется, что всем известный Spring Framework достиг своего пика с версией 2.5 (когда ввели активное использование аннотаций), а дальше идет по сути «шлифовка» — даже мажорный релиз 3.0 не так уж и велик.

отличается от 2,5. То же самое можно сказать и о предстоящий 3.1 - небольшие улучшения, настройки - но не более того.

Однако одна возможность в 3.1 мне показалась особенно интересной — кэширование.



Кэширование в Spring Framework 3.1

В любом приложении, которое мы разрабатываем, мы можем в какой-то момент столкнуться с проблемой производительности.

Одним из способов решения проблем является кэширование.

Естественно, вы можете кэшировать данные, возвращаемые из базы данных (Hibernate — самый используемый в Java и так делает это) — но гораздо интереснее кэшировать значения, возвращаемые с «сервисного» уровня.

Вычисление таких значений может быть достаточно трудоемким, предполагающим множество обращений к базе данных, другим сервисам и вычислениям — и соответственно, кэширование на этом уровне может привести к более значимым результатам.

В Spring Framework 3.1 это можно сделать с помощью аннотации @Кэшируемый На самом деле, кэширование на уровне сервиса раньше можно было реализовать в Spring Framework, но теперь это станет намного проще.



Кэширование значений
Например, если при профилировании вы узнали, что какой-то метод «тупой», например (как в документации) метод возврата книги по ISBN:

public Book findBook(ISBN isbn) {.

}

Теперь, чтобы закешировать значения, возвращаемые этим методом, достаточно добавить аннотацию:

@Cacheable("books") public Book findBook(ISBN isbn) {.

}

Эта аннотация повесит сам перехватчик, создаст ключ по параметрам, проверит, есть ли значение в кеше, а если нет, вызовет метод и закеширует результат. И все это? Почти, для полноты нужно:

Настройте кеширование в приложении
Это делается в XML-файле конфигурации контекста приложения:

<beans xmlns=" http://www.springframework.org/schema/beans " xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance " xmlns:cache="http://www.springframework.org/schema/cache " xsi:schemaLocation="http://www.springframework.org/schema/beans www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/cache www.springframework.org/schema/cache/spring-cache.xsd "> <cache:annotation-driven />

и настраиваем кэш-менеджер — например, самый простой (с помощью ConcurrentMap)

<bean class="org.springframework.cache.concurrent.ConcurrentCacheFactoryBean" p:name="default"/> <bean class="org.springframework.cache.concurrent.ConcurrentCacheFactoryBean" p:name="books"/>

или ehcache (можно использовать другие реализации):

<bean id="cacheManager" class="org.springframework.cache.ehcache.EhcacheCacheManager" p:cache-manager="ehcache"/> <bean id="ehcache" class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean" p:config-location="ehcache.xml"/>



Очистка кэша
Кэшировать данные нужно аккуратно — это всегда потенциальный источник ошибок, когда данные обновились, а кэша нет и приложение использует устаревшие данные.

Очистку кеша можно также выполнить с помощью аннотации — @CacheEvict:

@CacheEvict(value = "books", allEntries=true) public void loadBooks(InputStream batch)

Вот и все.

Только? Я так думаю.

На самом деле механизм кэширования достаточно гибкий, есть ряд дополнительных возможностей (таких как написание собственных аннотаций, генерация ключей и многое другое.

Но основной функционал выглядит таким простым.

Теги: #spring framework #кэширование #java

Вместе с данным постом часто просматривают:

Автор Статьи


Зарегистрирован: 2019-12-10 15:07:06
Баллов опыта: 0
Всего постов на сайте: 0
Всего комментарий на сайте: 0
Dima Manisha

Dima Manisha

Эксперт Wmlog. Профессиональный веб-мастер, SEO-специалист, дизайнер, маркетолог и интернет-предприниматель.