最大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" />
誰かアイデアはありますか?