Замечание:
Persistence provider-ы не обязаны поддерживать кэш второго уровня. Переносимые приложения не должны полагаться на поддержку кэша второго уровня со стороны persistence provider-а.
Java Platform, Enterprise Edition (Java EE) 8 Учебник по Java EE |
Назад | Вперёд | Содержание |
Кэш второго уровня — это локальное хранилище данных сущностей, управляемых persistence provider-ом для повышения производительности приложений. Кэш второго уровня помогает повысить производительность, избегая дорогостоящих вызовов базы данных, сохраняя данные объекта локально для приложения. Кэш второго уровня обычно прозрачен для приложения, так как он управляется persistence provider-ом и лежит в основе контекста персистентности приложения. То есть приложение считывает и фиксирует данные с помощью обычных операций entity manager-а, не зная о кэше.
Замечание: Persistence provider-ы не обязаны поддерживать кэш второго уровня. Переносимые приложения не должны полагаться на поддержку кэша второго уровня со стороны persistence provider-а. |
Кэш второго уровня для юнита персистентности может быть сконфигурирован в один из нескольких режимов работы. Следующие настройки режима кэширования определяются Java Persistence API.
Таблица 47-1. Настройки режима кэширования для кэша второго уровня
Настройка режима кэширования |
Описание |
|
Все данные сущности сохраняются в кэше второго уровня для этого юнита персистентности. |
|
Данные не кэшируются для юнита персистентности. Persistence provider не должен кэшировать какие-либо данные. |
|
Включено кэширование для сущностей, для которых оно явно установлено аннотациями |
|
Включено кэширование для всех сущностей, кроме тех, которым оно явно было запрещено аннотацией |
|
Поведение кэширования для юнита персистентности не определено. Будет использовано поведение кэширования по умолчанию для persistence provider. |
Одним из следствий использования кэша второго уровня в приложении является то, что данные могли измениться в таблицах базы данных, а значение в кэше — нет. Эта ситуация называется устаревшим чтением. Чтобы избежать устаревшего чтения, используются следующие стратегии:
Изменение кэша второго уровня одним из параметров режима кэша
Управление тем, какие объекты могут быть кэшированы (см. Контроль кэширования сущностей)
Изменение режима извлечения или сохранения из кэша (см. Установка режимов извлечения и сохранения в кэш)
Какая из этих стратегий будет наиболее подходящей и позволит избежать устаревшего чтения, зависит от приложения.
Аннотация javax.persistence.Cacheable
используется для указания того, что класс сущности и любые его дочерние классы могут кэшироваться при использовании режимов кэша ENABLE_SELECTIVE
или DISABLE_SELECTIVE
. Дочерние классы могут переопределить настройку @Cacheable
, добавив аннотацию @Cacheable
с изменённым значением.
Чтобы указать, что объект может быть кэширован, добавьте аннотацию @Cacheable
на уровне класса:
@Cacheable
@Entity
public class Person { ... }
По умолчанию значение аннотации @Cacheable
установлено в true
. Следующий пример полностью аналогичен предыдущему:
@Cacheable(true)
@Entity
public class Person{ ... }
Чтобы указать, что объект не должен кэшироваться, добавьте аннотацию @Cacheable
и установите для неё значение false
:
@Cacheable(false)
@Entity
public class OrderStatus { ... }
Когда установлен режим кэширования ENABLE_SELECTIVE
, persistence provider будет кэшировать все объекты сущностей с аннотацией @Cacheable(true)
и его дочерних классов, которые не были переопределены. Persistence provider не будет кэшировать объекты сущностей, помеченных @Cacheable(false)
или не имеющих аннотации @Cacheable
. Таким образом, в режиме ENABLE_SELECTIVE
будут кэшироваться только те объекты, которые были явно помечены для кэширования с использованием аннотации @Cacheable
.
Когда установлен режим кэширования DISABLE_SELECTIVE
, persistence provider будет кэшировать объекты сущностей, которые не имеют аннотации @Cacheable(false)
. Объекты, у которых нет аннотаций @Cacheable
, и объекты с аннотацией @Cacheable(true)
будут кэшироваться. Таким образом, режим DISABLE_SELECTIVE
будет кэшировать объекты всех сущностей, для которых кэширование не запрещено явно.
Если режим кэширования установлен на UNDEFINED
или оставлен неустановленным, поведение сущностей, аннотированных @Cacheable
, не определено. Если для режима кэширования установлено значение ALL
или NONE
, значение аннотации @Cacheable
игнорируется persistence provider-ом.
Назад | Вперёд | Содержание |