我们有可能处理多达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" />
有人有什么想法吗?
答案 0 :(得分:2)
作为一个FYI,SpringSource已将此识别为错误:Batch-1908。
作为一种解决方法,我们只是减少要使用给定运行处理的文件数,然后增加作业在给定日期内运行的次数。
我们使用2,000作为我们的文件限制,因为它提供了可接受的性能。
答案 1 :(得分:1)
将此作为替代方法。
从文件加载表更好地使用LOADDATA。
http://infolab.stanford.edu/~ullman/fcdb/oracle/or-load.html
这将以更好的方式改善性能。对我来说,处理一个包含100万条记录的文件只需要30秒