Кэш второго уровня против кеша запросов против кеша коллекции?
Насколько я понимаю, кэш второго уровня будет использоваться, когда объекты загружаются с использованием их первичного ключа. Это включает в себя выборку ассоциаций. Я могу думать только о методах 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
на соответствующем классе коллекции. Здесь очень хорошее объяснение спящего режима второго уровня.