Итерация по объекту JDBC Resultset

В программе на Java я использую сложный запрос (предложение select с внутренними соединениями и подзапросами). Я перебираю набор результатов и записываю вывод в текстовый файл.

Вывод предложения Select может состоять из 400 000 записей. Будет ли это вызывать какие-либо проблемы, если в результирующем наборе будет столько записей? Есть ли у ResultSet ограничения по записи/памяти?


person Sajal Saxena    schedule 12.10.2016    source источник
comment
Какую базу данных вы используете; Поведение набора результатов зависит от базы данных/драйвера и используемого параллелизма набора результатов.   -  person Mark Rotteveel    schedule 12.10.2016
comment
Вам нужны все 400 000 записей? Если нет, сузьте свой выбор в пункте WHERE, чтобы выбрать только те записи, которые вам действительно нужны.   -  person TT.    schedule 12.10.2016


Ответы (1)


Сам ResultSet не привязан. Однако ваш процесс JVM и сетевые возможности имеют ограничения. Если вам нужно обработать много записей из одного запроса, попробуйте поиграть с доступными параметрами ResultSet:

Statement stmt = con.createStatement("select * from dual", ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY);
stmt.setFetchSize(1000);

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

person SimY4    schedule 12.10.2016
comment
установка большего размера выборки будет быстрее, но с БОЛЬШИМ объемом памяти. Это просто компромисс между памятью и обходом БД. - person Adrian Shum; 12.10.2016
comment
@AdrianShum хорошо, для некоторых драйверов это на самом деле может привести к разделению запрошенного набора данных на более мелкие части и отправке их вам по одному вместо того, чтобы отправлять весь набор результатов сразу. Но я согласен с вами, размер выборки следует выбирать с умом. - person SimY4; 12.10.2016
comment
в любом случае я не могу себе представить, что установка большего размера выборки заставит драйвер разбивать данные на меньшие части. Вся цель для размера выборки состоит в том, чтобы сказать драйверу подготовить буфер для извлечения для предоставленного количества записей, это не будет иметь смысла, если получится уменьшить его. И это просто здравый смысл: если вы извлекаете больше вещей одновременно, вы уменьшаете количество обращений туда и обратно, но требуете больше памяти. Нет никакого способа, чтобы уменьшение размера вещей уменьшило количество поездок туда и обратно. - person Adrian Shum; 12.10.2016
comment
Конечно, если вы сравните размер выборки огромного размера с размером выборки разумно меньшего размера, меньший размер может потребовать меньше времени, но это просто потому, что накладные расходы, вызванные этим огромным буфером, вызывают медлительность. И установка 1000, как в вашем примере, редко является разумным числом, если только вы не собираетесь иметь дело с чрезвычайно огромным количеством записей. Обычно диапазон для большого размера выборки составляет около 20-100 - person Adrian Shum; 12.10.2016
comment
@AdrianShum Я не говорил больше. Если ваш набор составляет ~ 100 000 записей, разбить его на 100 фрагментов по 1000 записей лучше, чем ждать всех записей одновременно. - person SimY4; 12.10.2016
comment
Да, но это выбор размера выборки, вызывающий разницу, а не драйвер... разделение... на меньшую часть (поскольку вы устанавливаете больший размер выборки). Что я пытаюсь сказать: если вы увеличиваете размер выборки для повышения производительности, это будет увеличивать занимаемую память, а не уменьшать ее. - person Adrian Shum; 12.10.2016
comment
Если вы не знаете: на самом деле вы устанавливаете его БОЛЬШЕ. Размер выборки JDBC по умолчанию составляет 5 или 10 (я забыл точную цифру). то есть, если вы его не устанавливаете, он медленный, НЕ потому что он ждет всех записей, он медленный, потому что каждый раз он извлекает только 5/10 записей и есть много циклов. - person Adrian Shum; 12.10.2016
comment
@AdrianShum разве значения размера выборки по умолчанию не полностью зависят от реализации драйвера? Я на самом деле не готов спорить на эту тему, пока мы не знаем производителя базы данных. - person SimY4; 12.10.2016
comment
Моя вина здесь. Пожалуйста, прими мои извинения. Не знаю, почему я продолжаю считать, что OP использует Oracle...: P - person Adrian Shum; 12.10.2016
comment
База данных, над которой я работаю, - это «Oracle», а сервер приложений - Websphere. - person Sajal Saxena; 12.10.2016