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

Spring批处理JPAItemReader性能问题

Spring批处理JPAItemReader性能问题

UYOU 2022-05-21 21:01:46
下面是我的 spring 批处理作业的配置,它从数据库中获取记录,在项目处理器中进行一些处理,更新状态列并写回数据库。当我运行 10k 条记录时,我可以看到它一条一条地获取每条记录并以相同的方式更新状态。最初我打算使用多线程,但这没有任何意义,因为我的工作每天运行一次,记录数量从 10 到 100k 不等。(记录在大多数情况下少于 5k,一年中的少数几天(5 到 10 天)达到 50k 到 100k)。我不想在一年中的 10 天里增加更多的 CPU 并被 Kubernetes 收费。现在的问题是,当我运行这项工作时,它只需要 100 条记录,它独立运行每个选择查询,而不是一次需要 100 条。一次更新也是一条记录,处理 10k 条记录需要 10 分钟,这真的很慢。如何进行更快的读取、处理和写入?我可以摆脱多线程并偶尔获得更多的 CPU 利用率。更多信息在代码中作为注释给出。
查看完整描述

2 回答

?
九州编程

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

您只需一个配置属性即可为 INSERT、UPDATE 和 DELETE 语句启用 JDBC 批处理:

spring.jpa.properties.hibernate.jdbc.batch_size

它确定一次发送到数据库以执行的更新数量。

有关详细信息,请参阅此链接


查看完整回答
反对 回复 2022-05-21
?
手掌心

TA贡献1942条经验 获得超3个赞

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



查看完整回答
反对 回复 2022-05-21
  • 2 回答
  • 0 关注
  • 183 浏览

添加回答

举报

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