gpt4 book ai didi

multithreading - 提高简单 Spring Batch 作业性能的技巧

转载 作者:行者123 更新时间:2023-12-05 06:43:25 24 4
gpt4 key购买 nike

我是第一次使用 spring batch 应用程序,由于框架太灵活了,我有几个关于性能和实现作业的最佳实践的问题,我在 spring 文档中找不到明确的答案。

我的目标:

  1. 使用先前指定的布局(第 1 步阅读器)读取第三方发送的具有固定列长度值的 ASCII 文件

  2. 验证读取值并注册(日志文件)错误(自定义消息)

  3. 在处理器上应用一些业务逻辑来过滤任何不需要的线路(STEP 1 处理器)

  4. 在 oracle 数据库上写入有效行(STEP 1 编写器)

  5. 执行上一步后,使用步骤 1 完成时间戳(STEP 2 tasklet)更新数据库中的表

  6. 当作业停止时发送一封电子邮件,其中包含已处理的数量、错误和写入行、开始时间和完成时间的摘要(这些信息是否在 jobRepository 元数据中?)

假设:

  1. 文件是增量文件,因此第三方总是发送先前的文件行(可能有一些值更改)和任何新行(总共约 1.2 亿行)。每 6 个月发送一个新文件。
  2. 我们必须在处理时验证输入文件行(是否存在必需的值?有些可以转换为数字和日期?)
  3. 作业必须是可停止/可重新启动的,因为它旨在在时间窗口内运行。

我打算做什么:

为了提高读写性能,我避免使用 Spring 开箱即用的反射 bean,并使用 jdbcBatchWriter 将处理后的行写入数据库。

FileReader 使用自定义 FieldSetMapper 读取行,使用 FieldSet.readString 方法转换所有列(这意味着没有 阅读时出现 ParseException)。处理器上注入(inject)的 Bean 执行解析和验证,因此我们可以避免在读取过程中跳过异常,这似乎是一项昂贵的操作,并且可以计算无效行以通过 future 的步骤,将信息保存在步骤/作业执行上下文中。

处理器 bean 应该转换读取的对象并返回一个包装器,其中包含原始对象、解析值(即日期和长整型)、解析抛出的第一个最终异常以及指示验证是否成功或是否成功的 bool 值不是。在解析另一个 CustomProcessor 之后,通过查询已插入的相似或相同的寄存器来检查是否应该将寄存器插入到数据库中。在最坏的情况下,此业务规则可能意味着按有效行查询数据库。

jdbcItemWriter 丢弃处理器返回的空值并将有效寄存器写入数据库。

关于批处理的真正问题:

我可以使用哪些性能技巧来提高批处理性能?在初步尝试中,将完美有效的模拟输入文件加载到数据库中会导致 15 小时的处理,而无需查询数据库以验证是否应插入已处理的寄存器。什么是本地处理最简单的解决方案?

最佳答案

关于multithreading - 提高简单 Spring Batch 作业性能的技巧,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33414558/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com