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

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

Задание настроек режима кэширования для повышения производительности

Чтобы настроить параметры режима кэширования для юнита персистентности, укажите один из режимов кэширования в качестве значения элемента shared-cache-mode в дескрипторе развёртывания persistence.xml:

<persistence-unit name="examplePU" transaction-type="JTA">
    <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
    <jta-data-source>java:comp/DefaultDataSource</jta-data-source>
    <shared-cache-mode>DISABLE_SELECTIVE</shared-cache-mode>
</persistence-unit>

Примечание:

Поскольку спецификация Java Persistence API не требует поддержки кэша второго уровня, установка режима кэширования второго уровня в persistence.xml не будет иметь эффекта, если используется persistence provider без поддержки кэша второго уровня.

Кроме того, можно указать режим общего кэша, установив для свойства javax.persistence.sharedCache.mode один из параметров режима общего кэша:

EntityManagerFactory emf =
    Persistence.createEntityManagerFactory(
        "myExamplePU", new Properties().add(
            "javax.persistence.sharedCache.mode", "ENABLE_SELECTIVE"));

Установка режимов извлечения и сохранения в кэш

Если кэш второго уровня для юнита персистентности включён путём установки режима общего кэша, дополнительно можно изменить поведение кэша второго уровня, установив свойства javax.persistence.cache.retrieveMode и javax.persistence.cache.storeMode. Эти свойства могут быть установлены на уровне контекста персистентности передачей имени и значения свойства методу EntityManager.setProperty или установкой их для каждой операции EntityManager ( EntityManager.find или EntityManager.refresh) или на уровне запроса.

Режим извлечения из кэша

Режим извлечения из кэша, установленный свойством javax.persistence.retrieveMode, контролирует, как данные считываются из кэша для вызовов метода EntityManager.find и из запросов.

Можно установить для свойства retrieveMode одну из констант, определённых перечислимым типом javax.persistence.CacheRetrieveMode: USE (по умолчанию) или BYPASS.

Когда для свойства установлено значение USE, данные извлекаются из кэша второго уровня, если он доступен. Если данные не находятся в кэше, persistence provider будет читать их из базы данных.

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

Режим сохранения в кэше

Режим сохранения в кэше, установленный свойством javax.persistence.storeMode, контролирует, как данные сохраняются в кэше.

Свойство storeMode может быть установлено в одну из констант, определённых перечислимым типом javax.persistence.CacheStoreMode: USE (по умолчанию), BYPASS или REFRESH.

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

Если для свойства установлено значение BYPASS, данные, считанные или переданные в базу данных, не вставляются и не обновляются в кэше. То есть кэш неизменен.

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

Установка режима извлечения из кэша или режима сохранения

Чтобы установить режим извлечения или сохранения в кэш для контекста персистентности, вызовите метод EntityManager.setProperty, передав имя и значение свойства:

EntityManager em = ...;
em.setProperty("javax.persistence.cache.storeMode", "BYPASS");

Чтобы установить режим извлечения или сохранения в кэш при вызове методов EntityManager.find или EntityManager.refresh, сначала создайте Map<String, Object> и добавьте пару имя-значение следующим образом:

EntityManager em = ...;
Map<String, Object> props = new HashMap<String, Object>();
props.put("javax.persistence.cache.retrieveMode", "BYPASS");
String personPK = ...;
Person person = em.find(Person.class, personPK, props);

Примечание:

Режим извлечения из кэша игнорируется при вызове метода EntityManager.refresh, так как вызовы refresh всегда приводят к чтению данных из базы данных, а не из кэша.

Чтобы установить режим извлечения или сохранения при использовании запросов, вызовите методы Query.setHint или TypedQuery.setHint в зависимости от типа запроса:

EntityManager em = ...;
CriteriaQuery<Person> cq = ...;
TypedQuery<Person> q = em.createQuery(cq);
q.setHint("javax.persistence.cache.storeMode", "REFRESH");
...

Установка режима сохранения или извлечения в запросе или при вызове метода EntityManager.find или EntityManager.refresh отменяет настройку entity manager-а.

Программный контроль кэша второго уровня

Интерфейс javax.persistence.Cache определяет методы программного взаимодействия с кэшем второго уровня.

Здесь рассматриваются следующие темы:

Обзор интерфейса javax.persistence.Cache

Интерфейс Cache определяет методы для выполнения следующих действий:

  • Проверка наличия данных конкретной сущности в кэше

  • Удаление всех объектов заданной сущности из кэша

  • Удаление всех объектов сущности (включая объекты дочерних классов) из кэша

  • Очистка кэша с удалением данных всех объектов

Примечание:

Если кэш второго уровня отключён, вызовы методов интерфейса Cache не принесут никакого эффекта, за исключением contains, который всегда вернёт false.

Проверка наличия данных объекта сущности в кэше

Чтобы узнать, находится ли данный объект в кэше второго уровня:

  1. Вызовите метод Cache.contains. Метод contains возвращает true, если данные объекта находятся в кэше, и false в противном случае:

    EntityManager em = ...;
    Cache cache = em.getEntityManagerFactory().getCache();
    String personPK = ...;
    if (cache.contains(Person.class, personPK)) {
      // данные в кэше
    } else {
      // данных нет в кэше
    }

Удаление всех объектов заданной сущности из кэша

Чтобы удалить конкретный объект сущности или все объекты заданной сущности из кэша второго уровня:

  1. Вызовите один из методов Cache.evict.

  2. Чтобы удалить конкретный объект сущности из кэша, вызовите метод evict и передайте класс сущности и первичный ключ объекта:

    EntityManager em = ...;
    Cache cache = em.getEntityManagerFactory().getCache();
    String personPK = ...;
    cache.evict(Person.class, personPK);
  3. Чтобы удалить все объекты определённой сущности с её дочерними классами, вызовите метод evict и укажите класс сущности:

    EntityManager em = ...;
    Cache cache = em.getEntityManagerFactory().getCache();
    cache.evict(Person.class);

Все объекты сущности Person будут удалены из кэша. Если у сущности Person есть дочерний класс Student, вызовы вышеуказанного метода также удалят все объекты Student из кэша.

Очистка кэша

Чтобы полностью очистить кэш второго уровня, вызовите метод Cache.evictAll:

EntityManager em = ...;
Cache cache = em.getEntityManagerFactory().getCache();
cache.evictAll();

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