Hibernate L2 Cache на кластере - PullRequest
       11

Hibernate L2 Cache на кластере

2 голосов
/ 27 августа 2009

1: Я прав, что только этот вендор поддерживает Hibernate L2 кеш на кластере?

  • Терракота для зимней спячки (комерческая)
  • SwarmCache (не выпускается с 2003 года)
  • JBoss Cache 1.x
  • JBoss Cache 2

Q2: Есть ли какие-нибудь альтернативы Hibernate L2 кеш? (Может быть какое-то кеширование БД?)

Ответы [ 4 ]

10 голосов
/ 28 августа 2009

Q1. EhCache очень хорошо работает как распределенный кэш Hibernate L2. Мы используем это для нашего проекта.


Q2. Возможно несколько кешей.

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

Однако проблема с базой данных кеш в том что физически на сервер базы данных, поэтому каждый запрос включает в себя сетевой вызов (задержка, полоса с ..). В этом весь смысл из кешей по заявке сервер.


  • Кэш Hibernate L2 имеет некоторые особенности:
    • очень легко работать (без кода, мало настроек)
    • концептуально на уровне сущности (который довольно детализирован, нам иногда нужно кэшировать большие зерна, чтобы делать меньше запросов к базе данных),
    • работает по идентификатору или коллекции (например, кэширование результата запроса по умолчанию деактивировано, поскольку сделать его полезным в общем случае невозможно).

  • Когда Hibernate L2 не подходит, мы используем ту же библиотеку EhCache для кэширования данных (это не совсем сущности). Примеры вариантов использования:
    • когда таблица большая (длина и количество записей) , использование памяти не позволит полностью ее кэшировать, но кэширование только трех полей для всех записей вполне допустимо. Возможно, к этим полям обращаются часто или они неизменны ...
    • когда у нас много обращений к чтению в кэш, и каждый из них запускает вычисление (в кеше L2) с учетом имеющихся у нас объектов: результат вычисления может быть сохранен в кеше. (типичный пример, где для вычисления требуются данные из других таблиц, но детали не используются в конечном результате, поэтому кэш не хранит эти детали)
    • , когда сущности в таблице логически группируются по категориям , и мы хотим запрашивать и кэшировать по одной категории за раз вместо обычной политики кэша L2, которая будет представлять собой одну сущность за раз.

В распределенном контексте это часто переводит в аннулирование категория в то время, когда один из их сущности модифицируется, что функционально логично для нас (и важно для производительность, как в противном случае мы бы должны сделать недействительными все эти юридические лица; это потому что кеш делает недействительным целый регион, или конкретный объект, но в между циклом, что плохо для производительности)

И другие, я уверен ...

Так что этот случай не тесно связан с базой данных, он обычно не хранит наши объекты Hibernate. Мы помещаем его в бизнес-уровень (а не в доступ к данным или Daos), чтобы сделать его доступным непосредственно для бизнес-кодов. Обратите внимание, что для нас это не прозрачный кеш, а вызов явной бизнес-службы (ответственной за этот кеш: загрузка ее, если данные отсутствуют, аннулирование по мере необходимости), которая выполняет операции или доставляет значения.

Забавная проблема с многопоточностью в этом кеше: поскольку к этому кэшу обращаются наши сотни веб-потоков, он должен быть поточно-ориентированным. Вы, вероятно, знаете, почему потокобезопасное значение является неизменным или клонируется при каждом вызове (что часто является проблемой производительности). Таким образом, все наши бизнес-кэши используют неизменяемые объекты, и производительность великолепна.

2 голосов
/ 26 октября 2009

Вы также можете использовать [Infinispan (эволюция JBoss Cache) в качестве поставщика кэша 2-го уровня!] [1]

[1]: см. http://infinispan.blogspot.com/2009/10/infinispan-based-hibernate-cache.html

1 голос
/ 27 августа 2009

EhCache имеет распределенный режим, но я не уверен, поддерживается ли он в Hibernate. Я не понимаю, почему это не должно работать.

Вы не указали JBossCache 3 по какой-то определенной причине?

0 голосов
/ 23 января 2017

hibernate-redis lib будет идеальным выбором. Это кэш на основе Redis.

Почему Redis? он работает быстро, работает в облаке и имеет готовое облачное решение, такое как AWS Elasticache , поэтому вам не нужно управлять им самостоятельно.

...