Java Platform, Enterprise Edition (Java EE) 8
Учебник по Java EE

Назад Вперёд Содержание

Обзор кэша второго уровня

Кэш второго уровня — это локальное хранилище данных сущностей, управляемых persistence provider-ом для повышения производительности приложений. Кэш второго уровня помогает повысить производительность, избегая дорогостоящих вызовов базы данных, сохраняя данные объекта локально для приложения. Кэш второго уровня обычно прозрачен для приложения, так как он управляется persistence provider-ом и лежит в основе контекста персистентности приложения. То есть приложение считывает и фиксирует данные с помощью обычных операций entity manager-а, не зная о кэше.

Замечание:

Persistence provider-ы не обязаны поддерживать кэш второго уровня. Переносимые приложения не должны полагаться на поддержку кэша второго уровня со стороны persistence provider-а.

Кэш второго уровня для юнита персистентности может быть сконфигурирован в один из нескольких режимов работы. Следующие настройки режима кэширования определяются Java Persistence API.

Таблица 47-1. Настройки режима кэширования для кэша второго уровня

Настройка режима кэширования

Описание

ALL

Все данные сущности сохраняются в кэше второго уровня для этого юнита персистентности.

NONE

Данные не кэшируются для юнита персистентности. Persistence provider не должен кэшировать какие-либо данные.

ENABLE_SELECTIVE

Включено кэширование для сущностей, для которых оно явно установлено аннотациями @Cacheable.

DISABLE_SELECTIVE

Включено кэширование для всех сущностей, кроме тех, которым оно явно было запрещено аннотацией @Cacheable(false).

UNSPECIFIED

Поведение кэширования для юнита персистентности не определено. Будет использовано поведение кэширования по умолчанию для 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-ом.


Назад Вперёд Содержание
Логотип Oracle  Copyright © 2017, Oracle и/или её дочерних компаний. Все права защищены. Версия перевода 1.0.5 (Java EE Tutorial — русскоязычная версия)