Каков наилучший способ перебора большого набора результатов в JDBC / iBatis 3? - PullRequest
1 голос
/ 27 апреля 2010

Мы пытаемся перебрать большое количество строк в базе данных и преобразовать их в объекты. Поведение будет следующим:

  • Результат будет отсортирован по идентификатору последовательности, при изменении идентификатора последовательности будет создан новый объект. Созданный объект будет отправлен во внешнюю службу, и иногда ему придется ждать перед отправкой другой (это означает, что следующий набор данных не будет немедленно использован)
  • Мы уже вложили код в iBatis 3, поэтому решение iBatis будет для нас лучшим подходом (мы пытались использовать RowBounds, но не видели, как оно выполняет итерацию под капотом).
  • Мы хотели бы сбалансировать минимизацию использования памяти и сокращение количества обращений к БД.
  • Мы также открыты для чистого подхода JDBC, но нам бы хотелось, чтобы решение работало с различными базами данных.

ОБНОВЛЕНИЕ 1 :

  • Нам нужно сделать как можно меньше вызовов в БД (1 вызов был бы идеальным сценарием), при этом приложение также не должно использовать слишком много памяти. Есть ли какие-либо другие решения для этого типа проблемы, может быть, это чистый JDBC или любая другая технология?

ОБНОВЛЕНИЕ 2

  • Запрос будет управляться бэкэндом, и в данный момент будет выполняться только 1 экземпляр.

Спасибо и надеюсь услышать ваши идеи по этому поводу.

Ответы [ 2 ]

1 голос
/ 28 апреля 2010

Нам нужно сделать как можно меньше вызовов в БД (1 вызов был бы идеальным сценарием), при этом приложение также не должно использовать слишком много памяти. Есть ли какие-либо другие решения для этого типа проблемы, может быть, это чистый JDBC или любая другая технология?

Вы действительно не должны беспокоиться о количестве вызовов БД. Просто запросите данные, которые конечный пользователь должен увидеть сразу. Это не может быть сделано более эффективно. Google также не запрашивает всю базу данных, чтобы показать только первые 10. Нет, он запрашивает именно эти 10 для отображения, ни меньше, ни больше. Это намного, намного быстрее и эффективнее, чем перетаскивание / копирование всей базы данных в память приложения и работа над этим. Воспользуйтесь преимуществами СУРБД. Вот для чего он был изобретен / предназначен.

0 голосов
/ 27 апреля 2010

Кажется, вам нужна какая-то нумерация страниц . iBatis делает это через стандартные параметры LIMIT / OFFSET в запросе (и RowBounds в iBatis 3).

Но кажется (если я правильно понял), что вы также используете функцию GROUP BY iBatis, так что выборка, возвращающая N записей с полями N1 distint "idx", приводит к созданию N1 "родительских" объектов каждый один из которых имеет несколько дочерних объектов (всего создано N дочерних объектов). Или что-то типа того.

К сожалению (и по понятным причинам) обе вещи плохо смешиваются .

Я не вижу здесь никакой серебряной пули, можно подумать о многих подходах, у каждого есть свои недостатки - их трудно оценить без дополнительной информации.

Если основные объекты являются «большими» (много записей) и каждый из них будет обрабатываться индивидуально (с подключением к удаленному серверу), вы можете даже выполнить специальную нумерацию страниц, с объектом на страницу, запоминая внутренне ранее считанный идентификатор (что-то вроде SELECT ... FROM ... WHERE id = (SELECT MIN(id) FROM .... WHERE id > #lastid#))

...