2015-01-22 3 views
3

Мне очень сложно выбирать между eager fetch и lazy fetch. Поскольку все мы знаем, что eager fetch может сохранить данные после завершения сеанса, а lazy fetch больше похоже на получение данных по запросу и истекших после завершения транзакции, похоже, что eager fetch может тратить больше ресурсов и иногда извлекать ненужные данные.Какая возможность использовать Eager Fetch в JPA?

Например, если в корзине заказано 100 заказов, и каждый заказ содержит несколько «элементов» (поэтому существует двухуровневое отношение), и мы устанавливаем эти отношения в eager fetch, даже если мы хотим получить специфическая корзина атрибут:

// JPA will run many queries for the expire timestamp 
// if set all relation in ShoppingCart to Eager fetch... 
Date expire = ShoppingCart.find(id).getExpireTimestamp(); 

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

Однако, с другой стороны, я считаю lazy fetch не может быть быстрее, потому что Ленивые выборок требует транзакции просто запустить select * from .. fetch join..

Так что мой вопрос, что является Meric выбирать между Eager Fetch и Lazy fetch , а также между стоимостью памяти (от eager fetch) и стоимостью транзакции базы данных (от lazy fetch), что является победителем?

+0

Я склонен к по умолчанию к ленивому. Я также думаю, что спецификация извлечения не так важна, поскольку я извлекаю данные в основном по запросам (именованные запросы, критерии запросов), и на них режим выборки не применяется. – Michal

+2

Вы, конечно, будете использовать нетерпеливый выбор, если бы знали, что вам понадобятся все данные, участвующие в запросе. Но даже если вам не нужно все, быстрее получить ненужные данные вместо запуска другого запроса для каждой ленивой выборки. Как вы правильно заметили, вы должны взвесить разные виды затрат. Я думаю, что это сводится к опыту и/или бенчмаркингу. Там нет общеприменимых правил. Я склонен голосовать за мнение, основанное или слишком широкое, но я хотел бы посмотреть, есть ли хорошие ответы :-) –

+0

Взгляните на эту презентацию от JavaOne 2014: [Lazy Versus Eager Loading Strategies for JPA 2.1] (https : //oracleus.activeevents.com/2014/connect/fileDownload/session/7DF45BAE486FF80FD1990E15F374FAF8/CON1883_Wegrzynowicz-javaone2014-jpa.pdf) – wypieprz

ответ

0

EAGER fetching - это code smell. Если вы загружаете объекты через EntityMangager, тогда используется JOIN. Если вы загружаете их через API JPQL/Criteria, то используются вторичные выборки.

Лучше всего установить все ассоциации как LAZY и использовать JOIN FETCH. Стратегия выборки - это ответственность за время запроса и никогда не должна быть делегирована для сопоставления сущности.

Глобальный план выборки - плохая идея, тем более, что он не может соответствовать всем сценариям запросов приложений.

Таким образом, вы можете безопасно использовать LAZY с загрузкой JOIN FETCH с запросом времени.

Смежные вопросы