我正在与读者和作家一起使用。读者使用的是高页面大小为5000的JdbcPagingItemReader。编写器在块步骤上使用JdbcBatchItemWriter,提交间隔为5000。
<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不同的更新语句?
答案 0 :(得分:0)
架构中是否有任何触发器?如果是,那么可能是问题。
无论如何,我也会尝试减少提交间隔。 5000在我看来相当大,因为你说单个更新执行得很快,这可能有所帮助。
答案 1 :(得分:0)
您的更新查询将在每次调用时更新表中的每一行。它需要一个“ where”子句,理想情况下基于唯一或主键索引。