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

Другие вопросы по тегам