Spring Batch - Multi-File-Resource - занимает то же время, что и один поток?
Я использую Spring Batch для переноса данных из XML в Oracle Database.
При однопоточном выполнении процесс занимает около 80-90 минут, чтобы добавить 20 тыс. Пользователей.
Я хочу сократить его до половины, но даже используя многофайловый ресурс, я не могу этого добиться.
У меня есть один XML для обработки, поэтому я начал просто с добавления
- Исполнитель задачи и выполнение Reader синхронизированы, но не в состоянии добиться усиления.
Итак, что я делаю, я разделил XML на несколько XMLS и хочу попробовать использовать Multi File Resource. Вот конфигурация.
<batch:job id="importJob">
<batch:step id="step1Master">
<batch:partition handler="handler" partitioner="partitioner" />
</batch:step>
</batch:job>
<bean id="handler"
class="org.springframework.batch.core.partition.support.TaskExecutorPartitionHandler">
<property name="taskExecutor" ref="taskExecutor" />
<property name="step" ref="slaveStep" />
<property name="gridSize" value="20" />
</bean>
<batch:step id="slaveStep">
<batch:tasklet transaction-manager="transactionManager"
allow-start-if-complete="true">
<batch:chunk reader="reader" writer="writer"
processor="processor" commit-interval="1000" skip-limit="1500000">
<batch:skippable-exception-classes>
<batch:include class="java.lang.Exception" />
</batch:skippable-exception-classes>
</batch:chunk>
</batch:tasklet>
</batch:step>
<bean id="taskExecutor"
class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor">
<property name="corePoolSize" value="100" />
<property name="maxPoolSize" value="300" />
<property name="allowCoreThreadTimeOut" value="true" />
</bean>
<bean id="partitioner"
class="org.springframework.batch.core.partition.support.MultiResourcePartitioner"
scope="step">
<property name="keyName" value="inputFile" />
<property name="resources"
value="file:/.../*.xml" />
</bean>
<bean id="processor"
class="...Processor"
scope="step" />
<bean id="reader" class="org.springframework.batch.item.xml.StaxEventItemReader"
scope="step">
<property name="fragmentRootElementName" value="user" />
<property name="unmarshaller" ref="userDetailUnmarshaller" />
<property name="resource" value="#{stepExecutionContext[inputFile]}" />
</bean>
Мой единственный XML-файл содержит около 1000 пользователей, и я пытаюсь получить 20 файлов.
Я сохранил commit-interval=1000, так как каждый файл имеет 1000 записей для вставки в БД.
Нужно ли корректировать интервал коммита соответственно?
Я использую ORACLE DB. Нужно ли мне там управлять пулом? Текущий пул ORACLE DB, настроенный в JBOSS Min Pool = 100 Max Pool = 300
Я вижу, как логирование
17:01:50,553 DEBUG [Writer] (taskExecutor-11) [UserDetailWriter] | user added
17:01:50,683 DEBUG [Writer] (taskExecutor-15) [UserDetailWriter] | user added
17:01:51,093 DEBUG [Writer] (taskExecutor-11) [UserDetailWriter] | user added
17:01:59,795 DEBUG [Writer] (taskExecutor-12) [UserDetailWriter] | user added
17:02:00,385 DEBUG [Writer] (taskExecutor-12) [UserDetailWriter] | user added
17:02:00,385 DEBUG [Writer] (taskExecutor-12) [UserDetailWriter] | user added
Кажется, создается несколько потоков, но все же я не вижу здесь никакого улучшения производительности?
Подскажите пожалуйста что я делаю не так?
1 ответ
Пройти эту документацию для параллельной обработки
http://docs.spring.io/spring-batch/trunk/reference/html/scalability.html