Multithreading 提高简单Spring批处理作业性能的提示
我第一次使用spring批处理应用程序,由于框架过于灵活,我对性能和实现作业的最佳实践有一些问题,我在spring文档中找不到明确的答案 我的目标:Multithreading 提高简单Spring批处理作业性能的提示,multithreading,performance,spring-batch,partitioning,Multithreading,Performance,Spring Batch,Partitioning,我第一次使用spring批处理应用程序,由于框架过于灵活,我对性能和实现作业的最佳实践有一些问题,我在spring文档中找不到明确的答案 我的目标: 读取第三方以先前指定的布局发送的具有固定列长值的ASCII文件(步骤1读取器) 验证读取值并注册(日志文件)错误(自定义消息) 在处理器上应用一些业务逻辑以过滤任何不需要的行(步骤1处理器) 在oracle数据库上写入有效行(步骤1编写器) 执行上一步后,使用步骤1完成时间戳更新数据库上的表(步骤2 tasklet) 当作业停止时,发送一封电子邮件
jobsrepository
元数据中?)jdbcBatchWriter
将处理过的行写入数据库
FileReader
使用自定义的FieldSetMapper
读取行,使用FieldSet.readString
方法转换所有列(这意味着读取时没有ParseException
)。注入处理器上的Bean执行解析和验证,因此,通过这种方式,我们可以避免在读取过程中跳过异常,这似乎是一个昂贵的操作,并且可以计算通过未来步骤的无效行数,从而保存步骤/作业执行上下文的信息
处理器bean应该将对象转换为read,并返回一个包含原始对象、解析值(即日期和长度)、解析引发的第一个最终异常以及一个指示验证是否成功的布尔值的包装器。解析另一个CustomProcessor
后,通过查询已插入的类似或相同寄存器,检查是否应在数据库中插入寄存器。在最坏的情况下,此业务规则可能意味着按照有效行查询数据库
jdbcItemWriter
丢弃处理器返回的空值,并将有效寄存器写入数据库
因此,关于批处理的真正问题是:
我可以使用哪些性能提示来提高批处理性能?在一次初步尝试中,将完全有效的模拟输入文件加载到数据库中会导致15个小时的处理,而无需查询数据库以验证是否应插入已处理的寄存器。本地处理最简单的解决方案是什么 你见过分区吗?这也可能有助于获得真正的基线,我将从一个simpe作业开始,它读取模拟文件并写入。。。nothing(no op),这样您就可以获得file@MichaelPralow我尝试了你的建议,步骤的阅读部分花费了将近80%的时间。这个值实际上是有意义的,因为我在没有主键的数据库表中写入读取行。我读了更多关于批处理的内容,由于我需要使作业可重新启动,我认为最好对输入数据进行分区,并使用本地从机来处理每个分区。我选择的方法是将数据分区到本地从机步骤。唯一的缺点是编写一个与系统无关的步骤,将输入文件划分为n个单独的块。A基于[@guilhermerama请检查链接,它已断开:)正确的链接:()