Насколько значительны преимущества производительности отложенной загрузки JPA? - PullRequest
3 голосов
/ 25 апреля 2010

Я понимаю, что это очень специфично для конкретного приложения, но мне просто интересно, каково общее мнение или хотя бы какой-то личный опыт по этому вопросу.

У меня есть отвращение к шаблону «открыть сеанс в поле зрения», поэтому, чтобы избежать его, я думаю о том, чтобы просто с нетерпением извлекать все мелкое и использовать запросы на служебном уровне для извлечения большего объема.

Кто-нибудь использовал это и сожалел об этом? И есть ли какое-нибудь элегантное решение для отложенной загрузки в слое представления, о котором я не знаю?

Ответы [ 2 ]

5 голосов
/ 25 апреля 2010

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

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

3 голосов
/ 02 декабря 2010

Ленивая загрузка в основном требуется, если у вас есть хорошо разработанная схема и объекты, которые широко сопоставляются с другими объектами в приложении. Вот очень простой пример:

Персона сущность сопоставляет один ко многим Рефералы

Рефералы один на один Лицо дважды (Реферер и Рефери)

Достаточно просто, верно? Что ж, если вы используете готовую загрузку в этих двух отношениях, вы можете получить массу последующих запросов данных, которые вы, вероятно, не будете отображать в большинстве случаев.

Например:

Ваше приложение хочет загрузить запись " PersonA ", и у этого PersonA есть 3 записи рефералов, поскольку он ссылался на 3 клиентов: PersonB , PersonC и PersonD .

Так что, если у вас есть Eager, выбирающий эти отношения, JPA загрузит эти записи 3 человек. И скажем, PersonC привлек 10 клиентов, потому что он любит все, что вы продаете. Теперь JPA также должна загрузить этих 10 клиентов, опять же из-за энергичной загрузки.

Вы можете видеть, куда это идет. Если бы это были отношения с отложенной загрузкой, единственный раз, когда этот дополнительный набор данных был бы загружен, это когда вы непосредственно выполняете вызов getReferrals () для него.

Лично я бы не стал создавать дополнительные методы для этих выборок. Это большая дополнительная работа по написанию кода, и теперь вам нужно каким-то образом управлять состоянием сущностей и выполнять или нет дополнительную загрузку.

JPA облегчает эту задачу, если вы используете отложенную загрузку. Просто выполните любой вызов get ... (), который вы обычно делаете для объекта POJO, а JPA сделает все остальное.

...