Spring批处理JPAItemReader性能问题

下面是我的 spring 批处理作业的配置,它从数据库中获取记录,在项目处理器中进行一些处理,更新状态列并写回数据库。

当我运行 10k 条记录时,我可以看到它一条一条地获取每条记录并以相同的方式更新状态。最初我打算使用多线程,但这没有任何意义,因为我的工作每天运行一次,记录数量从 10 到 100k 不等。(记录在大多数情况下少于 5k,一年中的少数几天(5 到 10 天)达到 50k 到 100k)。

我不想在一年中的 10 天里增加更多的 CPU 并被 Kubernetes 收费。现在的问题是,当我运行这项工作时,它只需要 100 条记录,它独立运行每个选择查询,而不是一次需要 100 条。一次更新也是一条记录,处理 10k 条记录需要 10 分钟,这真的很慢。

如何进行更快的读取、处理和写入?我可以摆脱多线程并偶尔获得更多的 CPU 利用率。更多信息在代码中作为注释给出。


UYOU
浏览 240回答 2
2回答

九州编程

您只需一个配置属性即可为 INSERT、UPDATE 和 DELETE 语句启用 JDBC 批处理:spring.jpa.properties.hibernate.jdbc.batch_size它确定一次发送到数据库以执行的更新数量。有关详细信息,请参阅此链接

手掌心

谢谢大家的建议。我自己发现了这个问题。我正在使用 JdbcPagingItemReader 和 RepositoryItemWriter。阅读器按预期工作,但编写器正在为处理器后传递的每条记录触发选择查询。我相信背后的原因是,由于阅读器不是标准的 JPA 阅读器,因此该记录仅在处理器之后才会持久保存到 JPA。不过我不确定。但是将编写器更改为 JdbcBatchItemWriter 解决了这个问题。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java