Sobes.tech
Назад к вопросам
Junior — Middle
43

Каким образом осуществляется сохранение и извлечение объекта из кэша первого уровня в приложении?

Компании, где спрашивали
DCloud

Ответ от нейросети

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.
  • Основная цель — уменьшить число одинаковых запросов к базе внутри одной транзакции/сессии.