Каким образом осуществляется сохранение и извлечение объекта из кэша первого уровня в приложении?
Ответ от нейросети
sobes.tech AI
Что хотят услышать интервьюеры:
Кэш первого уровня — это встроенный кэш сессии, который работает внутри одного Session/EntityManager. При повторном запросе одной и той же сущности в рамках одной сессии объект не читается из БД второй раз, а берётся из памяти. Сохранение и извлечение происходят автоматически через контекст персистентности.
Определение:
Кэш первого уровня — это локальный кэш ORM на уровне одной сессии. Когда сущность загружается из базы, она помещается в этот кэш и становится управляемой текущим контекстом. Если затем в этой же сессии запросить ту же сущность по тому же идентификатору, ORM вернёт уже загруженный объект из памяти, а не выполнит повторный SQL-запрос.
Сохранение в кэш происходит автоматически после загрузки, persist/save и при наличии объекта в управляемом состоянии. Извлечение также автоматическое: при обращении по идентификатору сначала проверяется кэш первого уровня, и только если объекта там нет, выполняется запрос в БД.
Пример использования:
Session session = sessionFactory.openSession();
Transaction tx = session.beginTransaction();
User user1 = session.get(User.class, 1L); // SQL в БД
User user2 = session.get(User.class, 1L); // из кэша первого уровня, SQL не нужен
tx.commit();
session.close();
В этом примере первый вызов get загружает пользователя из базы и кладёт его в кэш сессии. Второй вызов в той же сессии возвращает уже тот же объект из памяти.
Пояснение кода:
openSession()создаёт новую сессию, а значит и новый кэш первого уровня.- Первый
session.get(User.class, 1L)обращается к БД, потому что объект ещё не находится в кэше. - После загрузки ORM помещает
Userв контекст персистентности. - Второй
session.get(User.class, 1L)сначала проверяет кэш первого уровня и находит там сущность. - В итоге повторного SQL-запроса не происходит, пока сессия не закрыта или объект не вышел из её контекста.
Код выше достаточно показателен; отдельный код для сохранения не требуется, потому что кэш первого уровня обновляется автоматически при работе с сущностями в рамках сессии.
Ключевые моменты:
- Кэш первого уровня всегда привязан к одной сессии/
EntityManager. - Он включён по умолчанию и не требует отдельной настройки.
- Повторная загрузка сущности по идентификатору в рамках одной сессии обычно идёт из памяти, а не из БД.
- Кэш очищается при закрытии сессии; между разными сессиями не сохраняется.
- Это не общий кэш приложения, а временный локальный буфер ORM.
- Основная цель — уменьшить число одинаковых запросов к базе внутри одной транзакции/сессии.