Я хотів би прояснити деякі моменти щодо кешу другого рівня сплячого режиму. Справа уточнити, чи будуть запити HQL завжди потрапляти в базу даних (принаймні для отримання ідентифікаторів).
Розглянемо, що ми маємо об'єкти
class Customer {
long id; // Primary key
String name;
set <Address> addressList; // One to many relationship
}
class Address{
long id; // Primary key
String houseName;
}
Таблиця бази даних для адреси має посилання на зовнішню ключу для клієнта (id), щоб підтримувати один-багато відносин.
Як передумову, я включив кеш рівня 2 для сплячого режиму як EHcache. Тільки об'єкт і асоціації налаштовані на кешування. Кешування запиту не ввімкнено.
Я знаю, що, якщо я використовую session.get () або session.load () більше одного разу, лише перший виклик запускає запит до баз даних, а наступні - дані з кеша 2 рівня.
Мої питання
1) Чи зможе HQL скористатися кешем другого рівня? В одному сеансі я виконував один HQL, щоб отримати об'єкт, використовуючи первинний ключ (id), "від клієнта c, де c.id =?") .SetParameter (1, 1005).
Якщо я виконую один і той же HQL в іншому сеансі, чи буде об'єкт Клієнта взятий з кеш-пам'яті рівня 2 або він знову потрапить до бази даних.
2) Розглянемо інший HQL виконаний from Customer as c left join fetch c.addressList
для вибору клієнта та пов'язаної адреси.
Якщо я виконую той же HQL в іншому сеансі, чи буде пов'язана адреса з кеша 2-го рівня, або вона знову потрапить до бази даних.
Відповіді:
4 для відповіді № 1Оскільки ви не активували кеш запиту, жоден запит не потрапляє до кешу 2-го рівня. Таким чином, обидва запити виконуються проти БД.
Ви можете включити кеш запитів, якщо ви хочете замість цих запитів використовувати кеш 2-го рівня. Перевіряти Ця стаття докладніше про цю тему.