Кэш второго уровня против кеша запросов против кеша коллекции?

Насколько я понимаю, кэш второго уровня будет использоваться, когда объекты загружаются с использованием их первичного ключа. Это включает в себя выборку ассоциаций. Я могу думать только о методах session.get(), session.load, где к изображению будет добавлен кэш второго уровня.

Если ассоциация является коллекцией или какой-либо другой сущностью, как ее можно кэшировать? Например:-

  @Cacheable
  public class Department{
   private List Employees;
   private DepatmentDetail detail ;

}

Как я могу сделать ассоциацию сотрудников и детали кэшируемыми? Я думаю, что мне нужно упомянуть @cache выше ассоциаций сотрудников и деталей. Но это не сработало?

когда разработчик делает Department.getEmployees(), hibernate внутренне запустит запрос, т.е.

 select * from employees where deptId =1;

Теперь, если я использую кеш запросов, где я явно делаю вышеупомянутый запрос и получаю результаты, запрос снова будет запущен в БД. почему запрос запускается снова. Я думаю, что это связано с тем, как в hibernate хранятся результаты кеша второго уровня и кеша запросов (они могут храниться в отдельных регионах). Если кто-то может пролить свет и на этот аспект, это будет здорово.

3 ответа

Решение

Посмотрите на ссылки ниже, где это объясняется в деталях.

Кэш на уровне запросов:

Hibernate также реализует кеш для наборов результатов запросов, который тесно интегрируется с кешем второго уровня.

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

Кэш второго уровня

Hibernate совместим с несколькими поставщиками кэша второго уровня. Любая реализация может быть использована для кэша второго уровня.

Разница:

Единственная цель Query Cache - кэшировать запросы, тогда как Second Cache можно использовать и для других кешей.

Кэш запросов предоставляется Hibernate внутри, тогда как для кэша второго уровня вы должны выбрать внешний кэш второго уровня, такой как Infinispan, EHCache и т. Д.

введите описание изображения здесь

Кэш второго уровня имеет внутреннюю хеш-таблицу для хранения данных. Ключ здесь будет идентификатором объекта, а значение будет обезвоженным значением объекта. Чтобы получить данные из этого кэша L2, у вас должен быть ключ, то есть идентификатор объекта. Ясно, что вы можете использовать его с методами, где вы выбираете сущность по id.

Этот сценарий изменяется, если у вас также включен query_cache с кешем L2. Кеш запросов хранит запрос и соответствующие ему идентификаторы объектов результатов. Теперь, даже если вы не выбираете по идентификатору (используя JPQL или HQL ИЛИ queryDsl), hibernate проверяет, был ли ранее запущен тот же запрос, и если да, получает список идентификаторов из кэша запросов. После этого возвращает объекты из кэша L2, соответствующие тем же идентификаторам.

Нам нужно явно поставить @Cache(usage=CacheConcurrencyStrategy.<VALUE>) на коллекциях и @Cacheable на соответствующем классе коллекции. Здесь очень хорошее объяснение спящего режима второго уровня.

Другие вопросы по тегам