我是新的春季批次。我最近尝试了一个批处理,它将从文件中读取记录并插入到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(准备好的声明)。
你可以告诉我为什么花费太多时间的任何解决方案
答案 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
的更多信息