Для циклов в Java по диапазону записей в базе данных

0

У меня есть два идентификатора, которые соответствуют диапазону записей в базе данных. Я хочу обрабатывать записи партиями 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-запрос. Это единственный способ? Для циклы правильный подход здесь?

  • 0
    Я не вижу причин, почему это не сработает.
  • 0
    Лучше загружать все до 59265 из БД в одном операторе SQL и использовать ответ Брэндона. Хиты БД могут быть дорогими!
Теги:
loops

3 ответа

5
Лучший ответ
   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
  • 0
    Я, конечно, очистил бы его с некоторыми переменными для начального значения, конечного значения и размера блока
  • 0
    это работает, но последняя итерация продолжается вечно, так как это значение i никогда не превышает 59265. Мне нужно будет добавить условие i = 59265 и выйти из цикла.
Показать ещё 2 комментария
1

Вы можете использовать цикл 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);
-1

Простым решением для этого было бы разбить цикл и выполнить остальные идентификаторы отдельно.

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
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню