Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Multithreading 提高简单Spring批处理作业性能的提示_Multithreading_Performance_Spring Batch_Partitioning - Fatal编程技术网

Multithreading 提高简单Spring批处理作业性能的提示

Multithreading 提高简单Spring批处理作业性能的提示,multithreading,performance,spring-batch,partitioning,Multithreading,Performance,Spring Batch,Partitioning,我第一次使用spring批处理应用程序,由于框架过于灵活,我对性能和实现作业的最佳实践有一些问题,我在spring文档中找不到明确的答案 我的目标: 读取第三方以先前指定的布局发送的具有固定列长值的ASCII文件(步骤1读取器) 验证读取值并注册(日志文件)错误(自定义消息) 在处理器上应用一些业务逻辑以过滤任何不需要的行(步骤1处理器) 在oracle数据库上写入有效行(步骤1编写器) 执行上一步后,使用步骤1完成时间戳更新数据库上的表(步骤2 tasklet) 当作业停止时,发送一封电子邮件

我第一次使用spring批处理应用程序,由于框架过于灵活,我对性能和实现作业的最佳实践有一些问题,我在spring文档中找不到明确的答案

我的目标:
  • 读取第三方以先前指定的布局发送的具有固定列长值的ASCII文件(步骤1读取器)

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

  • 在处理器上应用一些业务逻辑以过滤任何不需要的行(步骤1处理器)

  • 在oracle数据库上写入有效行(步骤1编写器)

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

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

  • 假设:
  • 文件是增量的,因此第三方总是发送先前的文件行(可能会有一些值更改)和任何新行(总共约1.2亿行)。每6个月发送一个新文件
  • 我们必须在处理时验证输入文件行(是否存在必需的值?某些值可以转换为数字和日期?)
  • 作业必须可停止/重新启动,因为作业要在时间窗口上运行
  • 我计划做什么: 为了获得一些读写性能,我避免使用Spring的开箱即用反射bean,并使用
    jdbcBatchWriter
    将处理过的行写入数据库

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

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

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

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

    你见过分区吗?这也可能有助于

    获得真正的基线,我将从一个simpe作业开始,它读取模拟文件并写入。。。nothing(no op),这样您就可以获得file@MichaelPralow我尝试了你的建议,步骤的阅读部分花费了将近80%的时间。这个值实际上是有意义的,因为我在没有主键的数据库表中写入读取行。我读了更多关于批处理的内容,由于我需要使作业可重新启动,我认为最好对输入数据进行分区,并使用本地从机来处理每个分区。我选择的方法是将数据分区到本地从机步骤。唯一的缺点是编写一个与系统无关的步骤,将输入文件划分为n个单独的块。A基于[@guilhermerama请检查链接,它已断开:)正确的链接:()