Я разрабатываю Spring Batch код.Мое приложение считывает данные счета из таблицы Account
.Обычно я получал Accounts
в диапазоне 800k - 1,6 миллиона.Мне нужно отправить все эти учетные записи в DW (Dataware House) в SQL-запросе, чтобы получить сведения об AUTH, DEBIT и CLEARING из DW для каждой учетной записи и сохранить эти данные в моих таблицах БД.
В Spring Batch IПодумайте об использовании разделов, я использовал следующий код:
<batch:step id="masterStep" next="getUniqueAccounts">
<partition step="fetchProcessedDataForAccounts" partitioner="accountPartitioner">
<handler grid-size="40" task-executor="taskExecutor" />
</partition>
</batch:step>
Также я использовал
<bean id="taskExecutor" class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor">
<property name="corePoolSize" value="40" />
<property name="maxPoolSize" value="40" />
<property name="allowCoreThreadTimeOut" value="true" />
</bean>
Наблюдение - я получаю 1,2 миллиона учетных записей из запросаТаким образом, будет создано 12 000 000/40 = 30 000 разделов, а в одном разделе будет создано 40 потоков.Я отправляю все эти учетные записи в формате LIST в предложение IN.
Я видел, что для создания всего 30 000 разделов код Spring Batch занимает около 4 часов, а затем запросы выполняются в DW.
Почему это происходит?