Как разбить набор результатов в Java на куски (по 500 строк каждый) без циклов? - PullRequest
2 голосов
/ 13 мая 2011

У меня есть запрос, который возвращает миллионы записей, которые содержатся в наборе результатов. Я должен обработать (вставить / обновить) эти записи. Вместо того, чтобы вставлять все записи сразу, я хотел бы разбить результирующий набор на куски по 500 записей каждый и сохранить их в ArrayList или Vector и обрабатывать эти 500 записей одновременно.

Как разделить набор результатов на куски и сохранить их в ArrayList или Vector, не просматривая миллион записей?

Я нашел ответ, получил возможность использовать CachedRowSet вместо результирующего набора. и используйте set setPageSize

CachedRowSet crs = new CachedRowSetImpl(); 
crs.setPageSize(500); 
crs.execute(conHandle); 

и затем используйте

  while(crs.nextPage()) {

        collection obj = crs.toCollections();
 }

это обеспечит возможность обработки больших данных в более мелкие куски

но у меня есть вопрос, как заполнить crs, передавая объект подключения, где упоминается строка запроса ??

Ответы [ 2 ]

4 голосов
/ 13 мая 2011

Зависит от вашего диалекта SQL.Например, в PostgreSQL есть предложения OFFSET и LIMIT для SELECT:

SELECT * FROM table LIMIT 500 OFFSET 0;

Вам все еще понадобится какой-то цикл для генерации запросов на получение всех миллионов ваших записей.

0 голосов
/ 13 мая 2011

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

Если проблема связана с памятью клиента - сначала выделите результат запроса в файле и разделите ваш файл с помощью команды unix split.

Вы можете анализировать ваш разделенный файл данных по файлу или bcp в рабочей таблице и загружать данные в ваш ArrayList.

...