Моей цели заключается в следующем:Как повторно использовать PreparedStatement, который зависит от результата выполнения
У меня есть SELECT
запроса с этим я хочу работать на базе данных с большим количеством строк. Этот запрос даст много результатов, поэтому я думал запустить его в итерациях с LIMIT 1000
и OFFSET ?
, где ?
будет последней строкой, обработанной на каждой итерации.
Например:
- Получить на строки 1 - 1000
- Получить строки 1001 - 2000
- Получить строки 2001 - 3000
- Получить строки 3001 - 4000
- ...
Я думал об этом в цикле, где каждая новая итерация будет устанавливать последнюю итерацию в качестве новой итерации OFFSET
(например: OFFSET 1001
, OFFSET 2001
и т. д., как показано выше).
Я новичок в использовании JDBC, поэтому это правильный способ сделать это? Если да, как я могу повторно использовать PreparedStatement
, когда я должен выполнить его и получить результат для каждой итерации?
Если это неправильный способ сделать это, каков правильный путь?
EDIT: Вот мой текущий код:
private static void import(Date from, Date to) throws Exception {
PreparedStatement p = connect.prepareStatement(statement);
p.setInt(1, 0);
p.add
ResultSet results;
for (int i=0; i< WAVES; i++) {
results = p.executeQuery();
Integer lastRow = importFrom(results);
p.setInt(1, lastRow.intValue()+1);
results.close();
}
p.close();
}
EDIT 2: Вот SQL строка:
SELECT
item.aitem_id, item.action_type, item.user_id, item.pid, item.pr_id, item.action_time, item.notes, item.screen, item.vid, item.lo_id,
vals.value_name, vals.simple_int_value, vals.simple_double_value, vals.simple_date_value, vals.simple_string_value,
data.version_id, data.prev_version_id
FROM mySchema.aitems item
JOIN mySchema.avalues vals ON item.aitem_id=vals.aitem_id
JOIN mySchema.adata data ON item.aitem_id=data.aitem_id
LIMIT 1000 OFFSET ?;
Я изменил и мой код и SQL для подготовки только с OFFSET
.
Не могли бы вы дать полный отбор? – Scadge
Зачем его разделять? Это, скорее всего, более неэффективно, чем получение всех ваших данных сразу. Особенно, если вы разбиваете их на мелкие куски 1000. – dispake
Я хотел разбить его, потому что это БД с живыми данными производства, поэтому я не хотел влиять на производительность. И мой запрос без ограничений создаст около 1,6 миллиона результатов. – Churro