Spring Batch - 多文件资源 - 与单个线程相同?

时间:2015-03-20 12:30:43

标签: multithreading spring-batch partitioning multifile

我使用Spring Batch进行从XML到Oracle数据库的数据迁移。

使用单线程执行,过程需要80-90分钟才能插入约20K用户

我希望将其减少到一半以上,但即使使用多文件资源,我也无法实现这一目标。

我有一个XML要处理,所以我开始只是添加

  • 任务执行者并使Reader同步但无法获得收益。

所以我正在做的事情,我将XML拆分为多个XMLS并希望尝试使用多文件资源。这是配置。

<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条记录要插入数据库。

是否需要相应调整commit-interval?

我正在使用ORACLE DB,我是否需要在那里进行任何池管理。 当前在JBOSS中配置的ORACLE DB池 最小池= 100 最大池= 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 个答案:

答案 0 :(得分:-2)