У меня есть два идентификатора, которые соответствуют диапазону записей в базе данных. Я хочу обрабатывать записи партиями 1000. Предположим, что два идентификатора - 51234 и 59265. Я хотел бы пропустить это и убедиться, что все записи обработаны.
Я начинаю с цикла for, как показано ниже.
for(int i = 51234; i < 59265; i= i+1000) {
select * from database where id between i and i+1000;
//do the stuff
}
Теперь это отлично работает до 59234-й записи, а как насчет последних 31 записи? Я также хотел бы обработать их в этом запуске.
Вероятно, я могу проверить, что значение я в каждой итерации и проверить, превышает ли добавление 1000 к запросу максимальный id и корректирует SQL-запрос. Это единственный способ? Для циклы правильный подход здесь?
int batchSize=1000;
for(int i = 51234; i <= 59265; i+=batchSize) {
select * from database where id between i and Math.min(i+batchSize, 59265);
//do the stuff
}
Результат выборки:
between 51234 and 52234 actualBatch=1000
between 52234 and 53234 actualBatch=1000
between 53234 and 54234 actualBatch=1000
between 54234 and 55234 actualBatch=1000
between 55234 and 56234 actualBatch=1000
between 56234 and 57234 actualBatch=1000
between 57234 and 58234 actualBatch=1000
between 58234 and 59234 actualBatch=1000
between 59234 and 59265 actualBatch=31
Поскольку между включенными, у вас есть совпадение в каждой партии. Вы можете изменить его и использовать неравенство, чтобы обойти это:
int batchSize = 1000;
int start=51234;
int end=59265;
for(int i = start; i < end + 1; i+=batchSize) {
select * from database where id >= i and id < Math.min(i+batchSize, end);
}
Пример вывода:
id >= 51234 and id < 52234 actualBatch=1000
id >= 52234 and id < 53234 actualBatch=1000
id >= 53234 and id < 54234 actualBatch=1000
id >= 54234 and id < 55234 actualBatch=1000
id >= 55234 and id < 56234 actualBatch=1000
id >= 56234 and id < 57234 actualBatch=1000
id >= 57234 and id < 58234 actualBatch=1000
id >= 58234 and id < 59234 actualBatch=1000
id >= 59234 and id < 59266 actualBatch=32
Вы можете использовать цикл do-while
while:
int i = 51234;
do {
// call DB: select * from database where id between i and i+1000
// do stuff
i = i + 1000;
} while (i < 59265);
Простым решением для этого было бы разбить цикл и выполнить остальные идентификаторы отдельно.
int i = 0;
for(i = 51234; i < 59265; i= i+1000) {
doAllStuff(i, 1000);
if(59265-i < 1000)
break;
}
doAllStuff(i, 59265-i);
doAllStuff() будет выглядеть следующим образом:
public void doAllStuff(int x, int y) {
select * from database where id between x and y;
//do the stuff
}