我们有可能处理多达 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" />
有人有想法么?