Спящий ленивый опасно? - PullRequest
3 голосов
/ 10 ноября 2011

Существуют ли сценарии, в которых использование дополнительной отложенной загрузки Hibernate может быть опасным?

Документация гласит: «Очень ленивая» выборка коллекции: отдельные элементы коллекции доступны из базы данных по мере необходимости. Hibernate старается не извлекать всю коллекцию в память без крайней необходимости. Подходит для больших коллекций.

Я не уверен, что понимаю последствия этого - означает ли это, что я потеряю производительность, если объявлю ВСЕ ассоциации слишком ленивыми, независимо от их размера? Есть ли какое-то эмпирическое правило по использованию дополнительной отложенной загрузки?

1 Ответ

4 голосов
/ 10 ноября 2011

Это обычная проблема N + 1, Что такое SELECT N + 1? , умноженная.Что касается производительности, трудно сказать: скорее всего, вы потеряете производительность.Но, возможно, нет.

Проблема в том, что, если вы попытаетесь выполнить итерацию по слишком ленивой коллекции, вы получите N + 1 запрос к базе данных: один для всей коллекции, один для каждой сущности.Это может или не может быть хорошим, в зависимости от кэширования и характера ваших данных.

Обновление: здравый смысл предлагает кодировать простейшую вещь (то есть настройки по умолчанию), а затем профилировать под реальным использованием сценариев и выбор реального подхода после получения данных.

Нет никакого реального смысла придерживаться одного конкретного решения заранее.Если вам нужен только один элемент из коллекции, экстра-ленивый поиск выиграет.Может быть.Если вам нужна вся коллекция, очень ленивый поиск повлияет на производительность.То есть, если у вас не весь домен кешируется, в этом случае вам все равно.Обычно.

Что касается Criteria API и явного декларирования, это как бы подрывает цель Hibernate: вы хотите, чтобы ваш бизнес-уровень не заботился (насколько это практически возможно) о отображении деталей.Поэтому, пока вы можете сохранять настройки сопоставления в самих сопоставлениях, лучше делать это.Как всегда, YMMV.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...