1

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

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" />   

有人有想法么?

4

2 回答 2

2

作为仅供参考,SpringSource 已将此识别为错误:Batch-1908

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

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

于 2012-11-20T18:20:23.803 回答
1

将此作为替代方法。

为了从文件中加载表,最好使用 LOADDATA 。

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

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

于 2012-11-19T07:48:06.473 回答