Ответ 1
Spring Пакет - идеальный инструмент для того, чтобы делать то, что вам нужно.
Шаг, ориентированный на блок, позволяет настроить, сколько элементов вы хотите читать/обрабатывать/записывать с помощью свойства commit-interval.
<batch:step id="step1" next="step2">
<batch:tasklet transaction-manager="transactionManager" start-limit="100">
<batch:chunk reader="myReader" processor="myProcessor" writer="MyWriter" commit-interval="800" />
<batch:listeners>
<batch:listener ref="myListener" />
</batch:listeners>
</batch:tasklet>
</batch:step>
Скажем, ваш читатель будет вызывать оператор SELECT, который возвращает 10 000 записей. И вы установите интервал фиксации = 500.
MyReader будет вызывать метод read() 500 раз. Скажем, что на самом деле реализация читателя может фактически удалить элементы из набора результатов. Для каждого вызова read() он также вызывается методом process() MyProcessor.
Но он не будет вызывать метод write() MyWriter до тех пор, пока не будет достигнут интервал фиксации.
Если вы посмотрите на определение интерфейса ItemWriter:
public interface ItemWriter<T> {
/**
* Process the supplied data element. Will not be called with any null items
* in normal operation.
*
* @throws Exception if there are errors. The framework will catch the
* exception and convert or rethrow it as appropriate.
*/
void write(List<? extends T> items) throws Exception;
}
Вы видите, что запись получает список элементов. Этот список будет размером вашего интервала фиксации (или меньше, если конец будет достигнут)
И btw, 10 000 записей ничего. Вы можете рассматривать многопоточность, если вам приходится иметь дело с миллионами записей. Но даже в этом случае достаточно просто поиграть со сладким пятном значения фиксации-интервала.
Надеюсь, что это поможет