spring-batch - 处理 1.15 亿条记录以插入 Oracle 的性能优化

标签 spring-batch

我有一个要求,我正在读取一个 Unix 中大小为 19 GB 且记录大约为 1.15 亿条的文本文件。一旦文件放置在该位置,我的 Spring Batch(启动器)就会被 Autosys 和 Shell 脚本触发。

最初执行此过程需要大约 72 小时来读取、处理(空检查和日期解析)并将数据写入 Oracle 数据库。

但在某些配置更改(如使用 Throttle Limit、Task Executor 等)之后,我目前能够将执行时间减少到 28 小时。 我需要这个过程在 4 小时内完成,另外,单独使用 SQL 加载器我在 35 分钟内完成了工作。但我必须只使用 spring Batch。

谁能告诉我是否可以使用 spring batch 在 4 小时内完成它,什么是实现它的最佳方法?

最佳答案

在我参与的一个项目中,我们必须将 50 亿条记录从 db2 传输到 oracle。具有相当复杂的转换逻辑。在转换过程中,数据在不同的文件中保存了大约 4 次。我们能够在 oracle 数据库中插入一行大约 50'000 条记录的数据。从这个角度来看,在 4 小时内完成这件事似乎是现实的。

您没有说明您的瓶颈到底在哪里,但这里有一些想法。

  1. 并行化 - 您能否将文件分成多个 block ,这些 block 可以并行处理,例如我们作业的多个实例?
  2. chunksize - 我们在写入 oracle 时使用了 5000 到 10000 的 chunksize
  3. 删除不必要的数据解析,尤其是日期/时间戳解析 - 例如,我们的数据中有很多时间戳,但它们与处理逻辑无关。由于在处理过程中我们不得不多次从文件读取它们或将它们写入文件,因此我们没有解析,我们只保留了字符串表示形式。此外,很多时间戳都有特殊值,例如 1.1.0001 00:00:00.000000 或 31.12.9999 23.59.59.000000,我们使用 LD 或 HD(用于低日期和高日期)来表示它们。

HTH.

关于spring-batch - 处理 1.15 亿条记录以插入 Oracle 的性能优化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32717610/

相关文章:

java - 写入多个文件时,为 MultiResourceItemWriter 创建的所有文件指定页眉和页脚 -spring batch

java - Spring Batch 步骤未执行

java - 无法在 Spring Batch 中启动 Asyc 作业

java - 如何使用 Spring Batch 发送多封电子邮件

java - <split/> 元素可能不会出现在具有抽象 ="true"spring 批处理的 <job/> 上

java - 使用 Spring-batch-excel 读取 Excel 时出错

java - Spring Batch事务异常:Existing transaction detected in JobRepository

java - 如何使用 SPRING-Batch 从一个数据库写入另一个数据库而不将结果集转换为临时对象列表或映射?

java - SqlPagingQueryProviderFactoryBeanhaving 子句

java - SOAP 1.2 消息在发送到仅 SOAP 1.1 端点时无效