Spring Batch服用时间过长

时间:2017-01-06 08:07:32

标签: spring spring-batch spring-jdbc jdbctemplate

我是新的春季批次。我最近尝试了一个批处理,它将从文件中读取记录并插入到MariaDB中。但是为了插入10k记录,它需要2分30秒。 我知道它太多时间了。表只有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

<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>

在com.my.sbatch.core.CustomFieldSetMapper中,com.my.sbatch.core.CustomPreparedStatement类我正在使用反射来映射来自File的文件 - &gt;豆和豆 - &gt; DB(准备好的声明)。

你可以告诉我为什么花费太多时间的任何解决方案

1 个答案:

答案 0 :(得分: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

的更多信息