Spring Batch:如何快速插入来自 Kafka 的 100 万条消息

问题描述 投票:0回答:1

我给你写这条消息是因为我有点迷失,因为我不知道如何解决我的问题。

背景

  • Spring Batch 中的 SimpleJob(SingleThread) 每天早上 7 点从某个主题(内部可信源)消耗 100 万条消息
  • 并将它们(逐一)插入中间表 (A)
  • 然后从 A 中以 1000 行为单位读取行,并将这些行(逐行)插入到目标表 B 中

技术

JAVA 17、Spring Batch、MySQL

问题

该工作需要 23 小时才能完成。我希望能把时间减少到2小时以内

改进建议

  • 删除中间表:将允许更少的 100 万个 SELECT/INSERT。我问以前的开发人员是否有理由维护这个表(其他地方没有使用)。
  • 使用批量插入:我读到这将有助于提高性能
  • 增加块大小(提交间隔):1000 个接缝的块太小,因此需要更多 SELECT/INSERT。块大小对于避免 OutOfMemory Java 堆空间错误是必要的。 但是除了随机测试值之外,我不知道如何确定好的块大小

问题

  • 在这种情况下,您是否看到维护中间表的一些充分理由?
  • 你知道我应该如何确定正确的块大小吗?
    • 价值观方面有什么标准吗?
    • 我可以只尝试随机值,直到它在可接受的时间内完成吗?
  • 您认为尝试分区作业/多线程作业对我的情况有帮助吗?或者会太过分?
    • 因为所有线程都会写入同一个数据库(可能是瓶颈?)

提前非常感谢您的帮助!

java mysql spring-batch
1个回答
0
投票

我们可以通过以下步骤实现批量插入到数据库的性能。 1.通过动态准备语句来使用jdbcTemplate的batchUpdate()方法。 2.利用正确的数据库连接池设置来优化数据库连接。 3.根据数据库服务器配置决定块大小。因为大多数数据库(如Oracle/SQL服务器)不支持一次插入超过1000条记录。 4.使用多线程方法以最少的时间处理数据。

© www.soinside.com 2019 - 2024. All rights reserved.