2017-01-06 12 views
0

新しいバネバッチです。私は最近、ファイルからレコードを読み込み、MariaDBに挿入するバッチを試しました。しかし、10kのレコードを挿入するには2分30秒かかる。 私はあまりにも多くの時間を知っています。テーブルには、キーが1つもない3つの列しかありません。ここでバネバッチが長すぎます

は、ここに私の仕事-XML

<beans xmlns="http://www.springframework.org/schema/beans" 
xmlns:batch="http://www.springframework.org/schema/batch" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:schemaLocation="http://www.springframework.org/schema/batch 
    http://www.springframework.org/schema/batch/spring-batch-2.2.xsd 
    http://www.springframework.org/schema/beans 
    http://www.springframework.org/schema/beans/spring-beans-3.2.xsd 
"> 

<import resource="../../context.xml" /> 
<import resource="../../database.xml" /> 

<bean id="itemProcessor" class="com.my.sbatch.processors.CustomItemProcessor" /> 

<batch:job id="file_to_db"> 
    <batch:step id="step1"> 
     <batch:tasklet transaction-manager="transactionManager" start-limit="100"> 
      <batch:chunk reader="cvsFileItemReader" 
       writer="databaseItemWriter" commit-interval="10"> 
      </batch:chunk> 
     </batch:tasklet> 
    </batch:step> 
</batch:job> 

<bean id="multiResourceReader" 
    class=" org.springframework.batch.item.file.MultiResourceItemReader"> 
    <property name="resources" 
     value="file:batch/csv/processing/*.csv" /> 
    <property name="delegate" ref="cvsFileItemReader" /> 
</bean> 

<bean id="mappingBean" class="com.my.sbatch.bean.Batch1Bean" 
    scope="prototype" /> 

<bean name="customFieldSetMapper" class="com.my.sbatch.core.CustomFieldSetMapper"> 
    <property name="classObj" ref="mappingBean"/> 
</bean> 

<bean id="cvsFileItemReader" class="com.my.sbatch.customReader.CustomItemReader" scope="step"> 

    <property name="resource" value="file:#{jobParameters['inputFile']}" /> 

    <property name="lineMapper"> 
     <bean class="com.my.sbatch.core.CustomLineMapper"> 

      <property name="lineTokenizer"> 
       <bean 
        class="org.springframework.batch.item.file.transform.DelimitedLineTokenizer"> 
        <property name="delimiter" value="#{jobParameters['delimiter']}" /> 
       </bean> 
      </property> 

      <property name="fieldSetMapper" ref="customFieldSetMapper" /> 
     </bean> 
    </property> 

</bean> 

<bean id="databaseItemWriter" class="org.springframework.batch.item.database.JdbcBatchItemWriter" scope="step"> 
    <property name="dataSource" ref="dataSource" /> 
    <property name="sql"> 
     <value> 
      <![CDATA[ 
       #{jobParameters['insert_JobQuery']} 
      ]]> 
     </value> 
    </property> 

    <property name="ItemPreparedStatementSetter"> 
     <bean class="com.my.sbatch.core.CustomPreparedStatement" /> 
    </property> 

は私のcontext.xmlがcom.my.sbatch.coreで

<beans xmlns="http://www.springframework.org/schema/beans" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:schemaLocation=" 
    http://www.springframework.org/schema/beans 
    http://www.springframework.org/schema/beans/spring-beans-3.2.xsd"> 

<!-- stored job-meta in memory --> 
<!-- 
<bean id="jobRepository" 
    class="org.springframework.batch.core.repository.support.MapJobRepositoryFactoryBean"> 
    <property name="transactionManager" ref="transactionManager" /> 
</bean> 
--> 

<!-- stored job-meta in database --> 
<bean id="jobRepository" 
    class="org.springframework.batch.core.repository.support.JobRepositoryFactoryBean"> 
    <property name="dataSource" ref="dataSource" /> 
    <property name="transactionManager" ref="transactionManager" /> 
    <property name="databaseType" value="mysql" /> 
</bean> 

<bean id="transactionManager" 
    class="org.springframework.batch.support.transaction.ResourcelessTransactionManager" /> 

<bean id="jobLauncher" 
    class="org.springframework.batch.core.launch.support.SimpleJobLauncher"> 
    <property name="jobRepository" ref="jobRepository" /> 
</bean> 

です.CustomFieldSe tMapper、com.my.sbatch.core.CustomPreparedStatementクラス私は、File - > beanとBean - > DB(Prepared文)のフィールドをマッピングするためのリフレクションを使用しています。

あなたは私にそれがこの例では

答えて

0

をあまりにも多くの時間を取っている理由のためのすべてのソリューションをアドバイスをしてくださいすることができ、あなたのバッチ処理は、単一のスレッドで実行されます。これはそれが長くかかる理由かもしれません。 TaskExecutor Beanでマルチスレッディングを使用することをお勧めします。例えば

<batch:job id="file_to_db"> 
<batch:step id="step1"> 
    <batch:tasklet task-executor="taskExecutor" transaction-manager="transactionManager" start-limit="100"> 
     <batch:chunk reader="cvsFileItemReader" 
      writer="databaseItemWriter" commit-interval="10"> 
     </batch:chunk> 
    </batch:tasklet> 
</batch:step> 

これは、マルチスレッドのための最も簡単な解決策ですが、情報へのアクセスと同時に環境での問題が発生することがあります。

この情報を読んで、さまざまなスケーラビリティ戦略を確認することをお勧めします。

スケーラビリティについての詳細here

関連する問題