Spring Batch Partition - создание раздела занимает много времени и влияет на пакетное задание - PullRequest
0 голосов
/ 13 октября 2018

Я разрабатываю 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.

Почему это происходит?

1 Ответ

0 голосов
/ 14 октября 2018

Я получаю 1,2 миллиона учетных записей по запросу, поэтому будет создано 12 000 000/40 = 30 000 разделов

У вас не будет 30 000 разделов (Кстати, это не 30 000,это 300.000 = 1.200.000 / 40), но только 40 разделов.У вас будет 300 000 элементов на раздел.

и в одном разделе будет создано 40 потоков

Это не так, как работает локальное разбиение.Вы определили пул потоков из 40 потоков.Каждый раздел будет обрабатываться одним потоком, а не 40 потоками.

Я отправляю все эти учетные записи в формате LIST в предложение IN.

Эта IMO имеет большую частьответственность в вашей проблеме производительности.Я бы рекомендовал вместо этого использовать шаблон запроса на вождение .Только для чтения идентификаторов учетных записей, затем обработчик ищет детали учетной записи и затем записывает их в таблицу назначения.Этот шаблон хорошо работает с моделью обработки, ориентированной на куски.

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...