Выбор ответа Senior Hibernate: N+1, lazy, кеш обновлено

Open Session in View

Вопрос

Почему в Spring Boot советуют выключать spring.jpa.open-in-view?

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: Соединение держится весь запрос, а ленивые связи дают скрытые N+1. С OSIV EntityManager живёт до конца запроса: ленивые связи прозрачно грузятся в контроллере и при сериализации JSON.

Варианты ответа

  1. OSIV отключает транзакции в сервисах на время HTTP-запроса
  2. Соединение держится весь запрос, а ленивые связи дают скрытые N+1правильный ответ
  3. С включённым OSIV нельзя использовать репозитории Spring Data
  4. OSIV запрещает EAGER-загрузку и превращает её в ленивую

Разбор

С OSIV EntityManager живёт до конца запроса: ленивые связи прозрачно грузятся в контроллере и при сериализации JSON. LazyInitializationException исчезает, но запросы к БД расползаются по слоям, появляются невидимые N+1, а соединение занято, пока клиент получает ответ. Boot по умолчанию включает OSIV и пишет предупреждение при старте. Транзакции, Spring Data и EAGER работают в обоих режимах.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.