Spring Batch MultiResourcePartitioner性能构建BATCH_STEP_EXECUTION表

时间:2012-11-14 19:55:41

标签: spring-batch

我们有可能处理多达20,000个文件的作业。我们正在使用MultiResourcePartitioner进行设置。这项工作确实有效,但我们注意到了瓶颈。

SpringBatch正在BATCH_STEP_EXECUTION表中为找到的每个文件创建条目,并且在为每个文件创建表条目之前不会处理任何文件。加载这个表似乎需要很长时间。

在本地测试中,尝试仅处理1,000个文件,将行添加到“BATCH_STEP_EXECUTION”需要38-40分钟。加载表后,文件处理速度非常快(通常不到1分钟)。

我希望这不是典型的行为,我只是遗漏了一些东西。

以下是数据库的设置方式(我们实际上是'OracleDataSource'的子类(我们使用'ojdbc6.jar'文件来获取类),而db_file是一个属性文件来获取url,密码,等):

<bean id="dataSource" class="oracle.jdbc.pool.OracleDataSource" destroy-method="close">
    <constructor-arg value="db_file" /> 
       <property name="connectionCachingEnabled" value="true" />  
       <property name="connectionCacheProperties"> 
         <props merge="default">   
            <prop key="InitialLimit">10</prop>       
            <prop key="MinLimit">25</prop>           
            <prop key="MaxLimit">50</prop>     
            <prop key="InactivityTimeout">1800</prop>
            <prop key="AbandonedConnectionTimeout">900</prop>
            <prop key="MaxStatementsLimit">20</prop> 
            <prop key="PropertyCheckInterval">20</prop>     
         </props>     
       </property>
</bean> 

以下是JobRepository定义的其余部分:

<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <property name="dataSource" ref="dataSource" />
</bean> 


<bean id="jobRepository" class="org.springframework.batch.core.repository.support.JobRepositoryFactoryBean" >
    <property name="databaseType" value="oracle" />
    <property name="dataSource" ref="dataSource" />
    <property name="transactionManager" ref="transactionManager" />
    <property name="isolationLevelForCreate" value="ISOLATION_DEFAULT"/>
</bean> 

<bean id="jobExplorer" class="org.springframework.batch.core.explore.support.JobExplorerFactoryBean">
    <property name="dataSource" ref="dataSource" />
</bean> 

<bean id="jobLauncher" class="org.springframework.batch.core.launch.support.SimpleJobLauncher"> 
    <property name="jobRepository" ref="jobRepository" /> 
</bean>

<bean id="jobParametersIncrementer" class="org.springframework.batch.core.launch.support.RunIdIncrementer" />   

有人有什么想法吗?

2 个答案:

答案 0 :(得分:2)

作为一个FYI,SpringSource已将此识别为错误:Batch-1908

作为一种解决方法,我们只是减少要使用给定运行处理的文件数,然后增加作业在给定日期内运行的次数。

我们使用2,000作为我们的文件限制,因为它提供了可接受的性能。

答案 1 :(得分:1)

将此作为替代方法。

从文件加载表更好地使用LOADDATA。

http://infolab.stanford.edu/~ullman/fcdb/oracle/or-load.html

这将以更好的方式改善性能。对我来说,处理一个包含100万条记录的文件只需要30秒