JdbcBatchItemWriterBuilder 与 org.springframework.jdbc.core.jdbcTemplate.batchUpdate

Posted

技术标签:

【中文标题】JdbcBatchItemWriterBuilder 与 org.springframework.jdbc.core.jdbcTemplate.batchUpdate【英文标题】:JdbcBatchItemWriterBuilder vs org.springframework.jdbc.core.jdbcTemplate.batchUpdate 【发布时间】:2021-01-04 05:59:42 【问题描述】:

我了解 jdbcTemplate.batchUpdate 用于在一次通信中将多条记录发送到数据库。 假设我有 1000 条记录要更新,而不是从应用程序到数据库的 1000 条通信,应用程序将发送 1000 条记录请求。

JdbcBatchItemWriterBuilder 将它的任务组合到一个作业中。

我的问题是,如果要通过 JdbcBatchItemWriterBuilder 处理 1000 条记录(INSERT 语句),是否一次性执行所有 INSERT?还是一个接一个?

如果一个接一个,使用 JdbcBatchItemWriterBuilder 连接数据库 1000 次会导致性能问题?怎么处理的?

我想了解 Spring 批处理是否比使用 jdbcTemplate.update 运行 1000 个 INSERT 语句表现更好?

【问题讨论】:

【参考方案1】:

JdbcBatchItemWriter 在内部使用java.sql.PreparedStatement#addBatchjava.sql.Statement#executeBatch(请参阅https://github.com/spring-projects/spring-batch/blob/c4010fbffa6b71cbcfe79d523023251ce73666a4/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/database/JdbcBatchItemWriter.java#L189-L195),因此对于块的所有项目都会有一个批量插入。

此外,这将在单个事务中执行,如参考文档的Chunk-oriented Processing 部分所述。

【讨论】:

感谢您的回复。如果一个 chunk 有 1000 个项目,第 100 行插入失败,我们可以让剩下的 900 个插入语句工作吗? 如果我在块中使用 1 个项目来更好地处理异常,我没有使用批处理功能。对吗? 您最初的问题与失败案例无关。如果在写入过程中发生可跳过的异常,Spring Batch 将扫描块中的错误项目(其他项目将在单独的事务中执行)。如果您使用 set commit-interval=1,您将不会从批量更新中受益(您将拥有 1000 个事务而不是 1 个)。如果有帮助,请接受答案(我相信它回答了您最初的问题)。

以上是关于JdbcBatchItemWriterBuilder 与 org.springframework.jdbc.core.jdbcTemplate.batchUpdate的主要内容,如果未能解决你的问题,请参考以下文章