为了账号安全,请及时绑定邮箱和手机立即绑定

在面向读写块的过程中,Spring Batch 在哪里提交?

在面向读写块的过程中,Spring Batch 在哪里提交?

不负相思意 2021-06-21 18:01:44
在我的 java 项目中,我有一个使用 Spring boot 的面向块的读取 ( FlatFileItemReader) - 写入 ( JdbcBatchItemWriter) 过程。使用HikariCp数据源。查看 Spring 批处理 jdbc 编写器,我们可以找到该部分:               //some code                @Override                public int[] doInPreparedStatement(PreparedStatement ps) throws SQLException, DataAccessException {                    for (T item : items) {                        itemPreparedStatementSetter.setValues(item, ps);                        ps.addBatch();                    }                    return ps.executeBatch();                }              //some code所以基本上在这里,如果我的 Hikari 数据源的setAutocommit参数为true,则意味着在ps.executeBatch()我的数据库将被更新之后。这里的第一个问题是,PreparedStatement.executeBatch() 它究竟是如何处理的?它是提交每个 sql 语句还是在每个 sql 语句的末尾?在该情况下,setAutocommit参数是假的,之后ps.executeBatch()它不应该被更新。由于 Spring 批处理应该管理事务等提交。我试图找到它在哪里提交以便更好地理解我遇到的问题。展望ChunkOrientedTasklet,SimpleChunkProcessor和TransactionTemplate我找不到在哪里的过程中它的承诺。所以我的第二个问题是,Spring 批处理在面向块的过程中究竟在哪里提交?编辑:使用 Spring 批处理 3.0.7编辑:似乎已处理AbstractPlatformTransactionManager.processCommit(DefaultTransactionStatus status)但仍然无法理解。
查看完整描述

2 回答

?
森林海

TA贡献2011条经验 获得超2个赞

您的自动提交参数无关紧要,Spring 将管理事物并在它认为合适时覆盖它(它确实认为合适)。

您可以设置提交间隔来定义您想要提交的频率。

您是否应该更改它完全取决于您打算如何批处理,您的执行是否会失败,是否应该跳过或重试这些情况以及其他类似的事情。


查看完整回答
反对 回复 2021-06-23
?
繁星coding

TA贡献1797条经验 获得超4个赞

关于“什么时候提交?”的问题,根据Spring Batch 文档

5.1 面向块的处理

Spring Batch 在其最常见的实现中使用“面向块的”处理风格。面向块的处理是指在事务边界内一次读取一个数据,并创建将被写出的“块”。从 ItemReader 读入一项,交给 ItemProcessor 并聚合。一旦读取的项数等于提交间隔,则通过 ItemWriter 写出整个块,然后提交事务。

//img1.sycdn.imooc.com//60d3054400016d8805900322.jpg

下面是上述相同概念的代码表示:


List items = new Arraylist();

for(int i = 0; i < commitInterval; i++){

    Object item = itemReader.read()

    Object processedItem = itemProcessor.process(item);

    items.add(processedItem);

}

itemWriter.write(items);

因此,如果你打算使用 Spring Batch,你不应该搞乱设置自动提交,因为这是你应该信任框架为你处理的事情。下面的部分显示了如何配置的示例:


5.1.1 配置步骤


尽管 Step 所需的依赖项列表相对较短,但它是一个极其复杂的类,可能包含许多协作者。为了简化配置,可以使用 Spring Batch 命名空间:


<job id="sampleJob" job-repository="jobRepository">

    <step id="step1">

        <tasklet transaction-manager="transactionManager">

            <chunk reader="itemReader" writer="itemWriter" commit-interval="10"/>

        </tasklet>

    </step>

</job>

上面的配置表示创建面向项目的步骤所需的唯一依赖项:


reader - 提供待处理项目的 ItemReader。


writer - 处理 ItemReader 提供的项目的 ItemWriter。


事务管理器 - Spring 的 PlatformTransactionManager 将用于在处理期间开始和提交事务。


job-repository - JobRepository 将用于在处理期间(就在提交之前)定期存储 StepExecution 和 ExecutionContext。对于内联(在 a 中定义的),它是元素上的一个属性;对于独立步骤,它被定义为 .


commit-interval - 在提交事务之前将处理的项目数。


查看完整回答
反对 回复 2021-06-23
  • 2 回答
  • 0 关注
  • 185 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信