Статьи

Кэш второго уровня в Hibernate: настройки и конфигурации

Сеанс Hibernate — это кэш постоянных данных на уровне транзакций. Мы можем настроить кластерный или JVM-уровень (SessionFactory-level) кеша для каждого класса и для каждого собрания. Мы также можем подключить кластерный кеш в Hibernate. Во время предоставления кеша мы должны понимать, что когда мы обновляем постоянную БД, она не будет автоматически отражаться на кеше.

Настройка CACHE в Hibernate

Нам нужно сообщить Hibernate, какую реализацию кэширования нам нужно использовать. Это можно сделать, указав имя класса, который реализует org.hibernate.cache.CacheProvider, используя свойство hibernate.cache.provider_class . Hibernate поставляется в комплекте с рядом встроенных интеграций с поставщиками кеша с открытым исходным кодом; Кроме того, мы могли бы реализовать свой собственный и подключить его, как описано выше. До версии 3.2 Hibernate по умолчанию использует EhCache в качестве поставщика кэша по умолчанию.

Чтобы найти поставщиков кэша, пожалуйста, проверьте этот пост <Нажмите здесь>

Отображения кэша

Элемент <cache> отображения класса или коллекции имеет следующую форму:

<cache 
    usage="transactional|read-write|nonstrict-read-write|read-only"  (1)
    region="RegionName"                                              (2)
    include="all|non-lazy"                                           (3)
/>

(1)

Использование (обязательно) определяет стратегию кэширования: транзакция, чтение-запись, нестрогая-чтение-запись или только чтение.

(2)

регион (необязательно, по умолчанию используется имя класса или роли коллекции) указывает имя области кэша второго уровня

(3)

include (необязательно, по умолчанию all) non-lazy указывает, что свойства объекта, отображенного с помощью lazy = «true», могут не кэшироваться, если включена отложенная выборка на уровне атрибута

Стратегия: только чтение
  • Полезно для данных, которые часто читаются, но никогда не обновляются .
  • Это просто .
  • Лучший исполнитель среди всех.

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

<class name="eg.Immutable" mutable="false">
    <cache usage="read-only"/>
    ....
</class>
Стратегия: чтение / запись
  • Используется, когда наши данные должны быть обновлены .
  • Он имеет больше накладных расходов, чем кэши только для чтения .
  • Когда вызывается Session.close () или Session.disconnect () , транзакция должна быть завершена в среде, где JTA не используется.
  • Он никогда не используется, если требуется уровень изоляции сериализуемой транзакции .
  • В среде JTA для получения JTA TransactionManager мы должны указать свойство hibernate.transaction.manager_lookup_class .
  • Чтобы использовать его в кластере, реализация кэша должна поддерживать блокировку .

Если приложению необходимо обновить данные, может подойти кэш для чтения и записи. Эту стратегию кэширования никогда не следует использовать, если требуется сериализуемый уровень изоляции транзакции. Если кеш используется в среде JTA, вы должны указать свойство hibernate.transaction.manager_lookup_class, указав стратегию получения JTA TransactionManager. В других средах вы должны убедиться, что транзакция завершена при вызове Session.close () или Session.disconnect (). Если вы хотите использовать эту стратегию в кластере, вы должны убедиться, что базовая реализация кэша поддерживает блокировку. Встроенный кеш провайдеров нет .

<class name="eg.Cat" .... >
    <cache usage="read-write"/>
    ....
    <set name="kittens" ... >
        <cache usage="read-write"/>
        ....
    </set>
</class>
Стратегия: нестрогая чтение / запись
  • Требуется, если приложению необходимо обновлять данные редко .
  • мы должны указать hibernate.transaction.manager_lookup_class, чтобы использовать это в среде JTA.
  • Транзакция завершается, когда Session.close () или Session.disconnect () вызывается в других средах (кроме JTA).

Если приложению требуется лишь время от времени обновлять данные (т. Е. Если крайне маловероятно, что две транзакции попытаются обновить один и тот же элемент одновременно) и строгая изоляция транзакций не требуется, может быть уместен кэш без ограничения на чтение и запись. Если кеш используется в среде JTA, вы должны указать hibernate.transaction.manager_lookup_class. В других средах вы должны убедиться, что транзакция завершена при вызове Session.close () или Session.disconnect ().

Стратегия: транзакционная
  • Он поддерживает только провайдеров транзакционного кэша, таких как JBoss TreeCache .
  • используется только в среде JTA .

Стратегия транзакционного кэша обеспечивает поддержку полностью транзакционных поставщиков кэша, таких как JBoss TreeCache. Такой кеш можно использовать только в среде JTA, и вы должны указать hibernate.transaction.manager_lookup_class.