2010-02-12 4 views
1

Я использую Nhibernate, но все же я смущен (lazy-load и Eagerly loading) эти две темы из-за плохого понимания Nhibernate.lazy-loading and Eagerly loading in Nhibernate

Пожалуйста, определите меня ленивой загрузкой и с нетерпением загружайте простые слова. Кроме того, почему мы используем lock.Dynamic Proxy?

ответ

10

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

class Parent { 
    String name; 
    List<Child> childs; 
} 

class Child { 
    String name; 
} 

При загрузке элемента Parent, ОРМ должен решить, если он загружает коллекцию Чайлдс также (через присоединиться к примеру), или если он задерживает запрос для загрузки в Чайлдс, пока вы на самом деле доступ к коллекции

parent.childs.get(0) 
  • При загрузке Чайлдс коллекцию вперед, то есть, прежде, чем получить доступ к коллекции, он охотно ЗАГРУЗКА потому что вы ждете, чтобы получить доступ к Чайлдс. Это можно сделать в одном запросе с недостатком приведения большего количества данных из БД.
  • Когда вы задерживаете нагрузку до момента обращения к фактической коллекции, ее называют ленивой загрузкой, потому что вы получаете только детей, когда они строго необходимы. Это полезно для получения только данных, когда это необходимо, за счет дополнительных запросов (например, для этой темы вы можете запросить Google для «N + 1 select hibernate»).

Если вы хотите вызвать запрос для извлечения дочерних элементов при обращении к коллекции, вам понадобится какой-либо обратный вызов/перехват в коллекции childs. Это делается через прокси-сервер в коллекции, поэтому вы можете перехватить каждый доступ к коллекции для получения данных из db. Вот почему вам нужна библиотека прокси/перехвата, такая как Castle.

+0

+1 Хорошее объяснение. – ewernli

4

Lazy loading = ждать, пока код явно не обратится к свойству/коллекции, прежде чем загружать его из базы данных.

Eager loading = активная загрузка этих данных заблаговременно, независимо от того, использует ли этот код его или нет.

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