2014-01-31 2 views
0

У меня очень длинная цепочка объектов, все из которых будут загружаться лениво. Мы используем JPA (не повезло на fetchmodes)Лучшие способы использования ленивой нагрузки

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

Ниже классов для представительских целей только

FirstObject.java 

@Lazy 
private Set<SecondObject> 

SecondObject.java  
@Lazy 
private Set<ThirdObject> // may load 20-30 objects 
@Lazy 
private Set<FourthObject> // may load 20-30 objects 

ThirdObject.java 
@Lazy 
private Set<FourthObject> // may load 10 - 100 records 

FourthObject.java 
@Lazy 
private Set<FifthObject> // may load 10-100 records 

.
.
.
(список можно продолжить)

Пограничный случай

Если вы видите, каждый ребенок загружает несколько детей, и нет никакого способа избежать. Представьте, что пользователь пытается загрузить Firstobject.java, и ему нужен полный граф объектов до графика FifthObject.java.

firstObject = session.get(FirstObject.class, 10); 

// Поскольку все дети ленивы, он пытается инициализировать их, как показано ниже.

firstObject.getSecondObject().size() // size() for load all the lazy children 

// Теперь каждый из ребенка является сбор и они ленивы, так что он должен сделать следующее

for(SecondObject sec: firstObject.getSecondObject()){ 
    sec.getThirdObject().size(); 
    //because third object needs fourth object we loop third and get all ffourth 
} 

Все выше код занимает около 7-10 секунд для запуска, и может быть больше, если дети больше.

Вопрос: Как загрузить объекты в этом случае? взаимодействие пользователя настолько неустойчиво, что нам может понадобиться или не понадобиться полный график.

Я думал об использовании настраиваемого языка JPQL/native SQL, который объединяет все связанные дочерние элементы и возвращает объекты Entity в качестве одного из параметров, но задается вопросом, хороши ли все усилия.

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

+0

Очень сложно рассмотреть полезные способы оптимизации доступа к данным, не зная ничего о том, что приложение действительно делает. Почему пользователь * должен * 260 объектов в контексте в одно и то же время? Не могли бы вы перепроектировать несколько экранов, чтобы они не были настолько плотными? Не могли бы вы вернуться и получить больше данных, поскольку пользователь пытается на самом деле посмотреть на него, а не на предварительную выборку такой информации? – Affe

+0

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

+0

Возможно, скалярный запрос, который возвращает данные, которые они действительно должны видеть, является хорошим вариантом. – Affe

ответ

1

Я думал об использовании пользовательского языка JPQL/native SQL, который объединяет все связанные дочерние элементы и возвращает объекты Entity как один из параметров, но задается вопросом, хороши ли все усилия.

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

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

+0

Звучит разумно. Я удивлен, почему ребята из JPA не ожидали этого сценария. – Zeus

+0

Ну, JPA - это о сохраняющихся объектах :-), поэтому я думаю, что их основной задачей является сужение импеданса между кодом и памятью. Но, как вы подняли эту идею, я вспомнил, что с JPA вы также можете проектировать результаты в DTO, которые, как представляется, являются более адекватным подходом для получения результатов от запросов отчетов. см. http://java.dzone.com/articles/jpa-basic-projections – Leo

+0

Да, это хорошая тема, но она решает только половину проблемы, мне все же приходится загружать связанные объекты, вызывая повторяющиеся enitity.prop. size(). Я могу пойти с решением JPQL. все еще жду, чтобы увидеть, есть ли лучшее решение. (не вижу) – Zeus

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