Что такое ленивая загрузка в, в спящем режиме?

Что такое ленивая загрузка в Java? Я не понимаю процесс. Кто-либо может помочь мне понять процесс ленивой загрузки?

169
задан Pascal Thivent 1 May 2010 в 00:42
поделиться

6 ответов

Скажем, у вас есть родитель, и у этого родителя есть набор детей. Теперь в спящем режиме можно "лениво" загружать дочерние процессы, что означает, что на самом деле не все дочерние процессы загружаются при загрузке родителя. Вместо этого, он загружает их при запросе. Вы можете либо явно запросить это, либо, что гораздо более распространено, в спячке они будут загружаться автоматически, когда вы пытаетесь получить доступ к дочерним процессам.

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

Также остерегайтесь проблемы n+1. В спящем режиме не все дети будут загружены при доступе к коллекции. Вместо этого, она загрузит каждого ребенка по отдельности. При итерации над коллекцией это вызовет запрос для каждого дочернего процесса. Чтобы избежать этого, вы можете обманом загрузить всех дочерних процессов одновременно, например, вызывая parent.getChildren().size().

262
ответ дан 23 November 2019 в 20:49
поделиться

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

Википедия

Ссылка на Ленивая загрузка из hibernate.org

.
2
ответ дан 23 November 2019 в 20:49
поделиться

Ленивая погрузка? Ну, это просто означает, что дочерние записи не выбираются немедленно, но автоматически, как только вы пытаетесь получить доступ к ним.

8
ответ дан 23 November 2019 в 20:49
поделиться

Мартин Фаулер определяет шаблон Ленивая загрузка в Шаблонах архитектуры корпоративных приложений как таковой:

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

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

Это не шаблон, специфичный для доступа к данным и Hibernate, но он особенно полезен в таких полях, и Hibernate поддерживает отложенную загрузку ассоциаций «один ко многим» и одноточечных ассоциаций (один к одному и многие ко многим). one) также при определенных условиях. Ленивое взаимодействие более подробно обсуждается в главе 19 Справочной документации по Hibernate 3.0.

24
ответ дан 23 November 2019 в 20:49
поделиться

«Ленивая загрузка» означает, что объект будет загружен только , когда вы фактически обращаетесь к объекту в первый раз.

Шаблон выглядит следующим образом:

public Entity getEntity() {
    if (entity == null) {
        entity = loadEntity();
    }
    return entity;
}

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

В Hibernate вы можете настроить отложенную загрузку коллекции дочерних сущностей. Затем фактическая отложенная загрузка выполняется внутри методов PersistentSet , которые Hibernate использует «под капотами» для назначения коллекции объектов как Set .

Например.

public class Parent {
    private Set<Child> children;

    public Set<Child> getChildren() {
        return children;
    }
}

.

public void doSomething() {
    Set<Child> children = parent.getChildren(); // Still contains nothing.

    // Whenever you call one of the following (indirectly), 
    // Hibernate will start to actually load and fill the set.
    children.size();
    children.iterator();
}
72
ответ дан 23 November 2019 в 20:49
поделиться

Hiberante поддерживает функцию отложенной инициализации как для сущностей, так и для коллекций. Движок гибернации загружает только те объекты, к которым мы запрашиваем, а не другие энтиты или коллекции.

lazy="false" по умолчанию при загрузке инициализации упоминание для единственного дочернего значения lazy.in случае true, то есть родительский загружается, не поддерживает дочерний элемент

0
ответ дан 23 November 2019 в 20:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: