Сеанс 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.