我正在与读者和作家一起使用块步骤。阅读器正在使用一个页面大小为 5000 的 JdbcPagingItemReader。编写器在块步骤上使用具有 5000 提交间隔的 JdbcBatchItemWriter。
<batch:step id="createRecords">
<tasklet allow-start-if-complete="true" >
<chunk reader="readTable" writer="createNewRecords"
commit-interval="5000" skip-limit="100" >
<skippable-exception-classes>
<batch:include class="java.lang.Exception"/>
</skippable-exception-classes>
</chunk>
</tasklet>
</batch:step>
当我使用这个块步骤来加载记录时,一切都按我的预期工作。它一次插入 5000 条记录(当没有错误时),性能符合预期。在一分钟内处理 10000 条记录等。
但是,当我使用相同的块步骤(完全相同的读取器)并更改编写器使用的 SQL 来执行 UPDATE 语句(如在基本 SQL 更新中与 INSERT 相对)时,应用程序最多需要 30 多分钟才能完成更新 50K 记录,这是很差的。整个表的 SQL 中的单个更新语句(几乎相同)在几秒钟内运行。如果可能的话,我想利用批处理。
<bean id="createNewRecords" class="org.springframework.batch.item.database.JdbcBatchItemWriter">
<property name="dataSource" ref="dataSource" />
<property name="sql">
<value>
<![CDATA[
UPDATE TABLE SET TABLE_COLUM = :test
]]>
</value>
</property>
<property name="itemSqlParameterSourceProvider">
<bean class="org.springframework.batch.item.database.BeanPropertyItemSqlParameterSourceProvider" />
</property>
</bean>
想知道这听起来像一个配置问题 - 还是春季批处理 JdbcBatchItemWriter 对更新语句的处理方式不同?