Мы пытаемся перебрать большое количество строк из базы данных и преобразовать их в объекты. Поведение будет следующим:Каков наилучший способ перебора большого набора результатов в JDBC/iBatis 3?
- Результат будет отсортирован по идентификатору последовательности, при изменении идентификатора последовательности будет создан новый объект. Созданный объект будет отправлен во внешнюю службу и иногда придется ждать перед отправкой другого (что означает, что следующий набор данных не будет немедленно использован)
- Мы уже вложили код в iBatis 3, поэтому решение iBatis будет быть лучшим подходом для нас (мы пробовали использовать RowBounds, но не видели, как он выполняет итерацию под капотом).
- Мы хотели бы сбалансировать минимизацию использования памяти и сокращение числа отключений БД.
- Мы также открыты для чистого подхода JDBC, но мы хотели бы, чтобы решение работало в разных базах данных.
UPDATE 1:
- Нам нужно сделать так несколько звонков в БД, как это возможно (1 вызов был бы идеальный вариант), а также не позволяет приложению использовать слишком много памяти. Существуют ли какие-либо другие решения для такого типа проблем, может быть, это чистый JDBC или любая другая технология?
UPDATE 2
- запрос будет бакэнд привода и будет иметь только 1 экземпляр выполняющегося в данный момент времени.
Спасибо и надеюсь услышать ваши идеи по этому вопросу.
1. У меня было ощущение, что iBatis использует LIMIT/OFFSET, я думаю, это означает, что ему нужно попасть в базу данных для каждой страницы правильно? 2. Мы делаем группировку на стороне Java, поэтому нет необходимости использовать группу по ключевому слову в запросе, нам просто нужно отсортировать результаты по идентификатору, чтобы мы могли закончить создание одного объекта с дочерними узлами того же идентификатора перед обработкой следующие объекты. 3. Ваша adhoc pagination звучит как хорошая альтернатива подходу RowBounds. Таким образом, мы гарантируем, что будет восстановлен только следующий объект. Я дам вам попробовать и проверить производительность. Спасибо за помощь leonbloy! –
Я добавил новое требование, которое должно сделать как можно меньше DB roundtrips. Надеюсь, вы также можете прокомментировать обновления. Благодаря! –
Я настаиваю на том, чтобы сделать это в одном запросе БД, взглянуть на RowHandler или ResultHandler - (или, более экзотически, вернуть ResultSet/Cursor - или вернуться к простому JDBC). Но это разумно, если действие, которое должно выполняться удаленно для каждого «объекта», должно давать ответ (быстро - не зависящий от какого-либо взаимодействия с человеком), и вы можете верить, что цикл будет завершен. – leonbloy