Каковы основные проблемы при использовании спящего режима отложенной загрузки? - PullRequest
5 голосов
/ 17 января 2011

Я несколько раз слышал, что в спящем режиме возникают некоторые проблемы (особенно при использовании отложенной загрузки).Какие из них наиболее распространены и что с ними можно сделать?

Ответы [ 3 ]

9 голосов
/ 17 января 2011

Наиболее распространенной, вероятно, является проблема выбора n + 1 , когда отложенная загрузка коллекции приводит к попаданию в БД с n + 1 отдельными запросами вместо одного запроса на соединение.

Противоядие от таких вопросов - здравый смысл :-) Я считаю, что все соответствующие источники (прежде всего Hibernate ссылка ) обсуждают это (и другие связанные) проблемы, а также решения и обходные пути.Короче говоря, вы не должны слепо копировать рецепты из кулинарной книги - измеряйте производительность своего кода и настраивайте его соответствующим образом.Если вы видите слишком много выполненных выборок, вы можете выборочно переключаться с отложенной загрузки на присоединение или выборочный выбор стратегии для этого конкретного свойства / класса / запроса.(Обратите внимание, что оба из них имеют свои потенциальные недостатки, поэтому снова измерение производительности является ключевым.)

Другая, более редкая, проблема возникает, когда код клиента зависит от фактического типа объекта / свойства(например, проверяя его с помощью instanceof. Такой код ломается, если он встречает прокси-объект, который не является экземпляром конкретного класса, за который он выступает. Однако, в любом случае, это не лучшая идея для написания такого кода, и он долженочень редко бывает необходимо. Однако иногда он наследуется устаревшим кодом, что вызывает конфликт, который может быть трудно обойти.

1 голос
/ 06 апреля 2016

Прежде всего, Получение EAGER - гораздо большая проблема . Ленивое извлечение - это путь, который позволяет вам получать столько информации, сколько вам нужно.

Единственная проблема, с которой вы можете столкнуться, это LazyInitializationException, если вы не инициализируете ленивые ассоциации при открытом Session и пытаетесь перемещаться по неинициализированному прокси / коллекции после закрытия контекста персистентности.

Проблема с запросом N + 1 может возникнуть как для активных (когда вы выполняете запрос JPQL, который явно не выбирает все активные ассоциации), так и для ленивых ассоциаций, и решение такое же, как с LazyInitializationException.

Тем не менее, вы можете обнаружить все проблемы с запросами N + 1 автоматически во время тестирования. Посмотрите эту утилиту, основанную на datasource-proxy, для более подробной информации по этой теме .

0 голосов
/ 17 января 2011

Стратегия выборки HQL может использоваться для преднамеренного указания того, что должно быть загружено.Например (из Hibernate Reference ):

from Cat as cat inner join fetch cat.mate left join fetch cat.kittens

К сожалению, Hibernate не поддерживает все стандартные возможности выбора SQL как части HQL, что в зависимости отТребования проекта, могут быть непомерно высокими.Например, выбор из выбора невозможен, но часто требуется для создания отчетов или выполнения анализа данных.

Эту проблему можно решить с помощью возможности Hibernate выполнять SQL.Однако этот подход не обеспечивает объектно-ориентированного качества HQL (например, все объединения должны быть созданы вручную).

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