1

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

誰かアイデアはありますか?

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 に答える