Можно лениво загрузить пакетное поле, сохраняя при этом жесткую связь? - PullRequest
1 голос
/ 04 июня 2011

Предположим, у меня есть следующий класс:

public class Foo {
    public Bar bar;
}

Один гигантский запрос iBATIS загружает множество экземпляров Foo и заполняет все поля bar из базы данных. Я хотел бы разбить гигантский запрос на две части:

  • Один запрос для загрузки множества Foo экземпляров, при этом поля bar равны нулю.
  • Другой запрос для загрузки всех полей bar для некоторых связанных Foo экземпляров.

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

Хитрость в ассоциации. Я могу пакетно загрузить bar поля, но как лучше вставить эти данные обратно в соответствующие Foo с? Есть ли способ обойти один запрос на лениво загруженное поле экземпляра? Это похоже на то, что это может снизить производительность iBATIS.

1 Ответ

1 голос
/ 01 июля 2011

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

Поэтому мы обычно моделируем его таким образом, чтобы член был отделен. Допустим, у вас есть магазин с пользователями. Вместо того, чтобы моделировать пользователей как список в вашем магазине, у вас есть вызов DAO, который гласит «List getUsersForShop (shop)».

Некоторые из наших страниц становятся еще лучше. Для разбитых на страницы веб-страниц нет смысла получать все объекты из базы данных, поскольку они не отображаются одновременно. Таким образом, мы разделили это еще дальше:

Список getUserIdsForShop (магазин)

и затем для каждой строки на странице мы делаем «User getUserForId (long id)».

Это приведет к минимальному потоку данных между сервером, базой данных и клиентом и уменьшит количество вызовов на страницу. Если ваш результат поиска 10.000 пользователей, но вы отображаете только 10 на страницу, вы только что сохранили выборку 99990 пользователей и сохранили их в памяти.

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

...