【问题标题】:Spring Batch Performance Improvement for a complex job复杂作业的 Spring Batch 性能改进
【发布时间】:2020-01-10 15:41:30
【问题描述】:

我有一个每天运行的 Spring Batch Job,有大约 100k 条记录要处理。我的批次配置如下。

ItemReader :我使用 JdbcCursorItemReader 从单个表中读取数据(该表包含所有源记录)。 大小为 1000

ItemProcessor :这里我添加了对每条记录执行验证的逻辑。验证包括检查数据的正确性,一旦验证完成,我将验证几张表(为此记录)。

ItemWriter :这里我根据验证结果更新了最终表格。(这是一个批量操作,我使用 JdbcTemplate.batchUpdate 来加快处理速度) .

结果: 处理 104000 条记录的工作大约需要 140 分钟。由于这是每天运行,并且许多其他作业在生产中并行运行,我想提高这批的性能。

有人可以建议一个更好的方法来增强这批吗? (我在步骤配置中尝试了spring批处理使用taskexecutor提供的多线程方法,但我在阅读器中遇到了一些光标问题,如下所示)

**Caused by: org.springframework.dao.InvalidDataAccessResourceUsageException: Unexpected cursor position change.
at org.springframework.batch.item.database.AbstractCursorItemReader.verifyCursorPosition(AbstractCursorItemReader.java:368)
at org.springframework.batch.item.database.AbstractCursorItemReader.doRead(AbstractCursorItemReader.java:452)
at org.springframework.batch.item.support.AbstractItemCountingItemStreamItemReader.read(AbstractItemCountingItemStreamItemReader.java:88)
at org.springframework.batch.core.step.item.SimpleChunkProvider.doRead(SimpleChunkProvider.java:91)
at org.springframework.batch.core.step.item.FaultTolerantChunkProvider.read(FaultTolerantChunkProvider.java:87)**

Screenshot of CPU sample inside ItemProcessor

【问题讨论】:

    标签: java spring multithreading postgresql spring-batch


    【解决方案1】:

    使用 JVisualVm 来监控应用程序内部的瓶颈。 由于您说“处理 104000 条记录的工作大约需要 140 分钟”,因此您将更好地了解您在哪里获得性能命中。

    VisualVm tutorial

    打开 visualvm 连接您的应用程序 => 采样器 => cpu => CPU 示例。 在不同时间拍摄快照并分析需要花费大量时间的地方。通过仅选中此项,您将获得足够的数据进行优化。

    注意:JvisualVm 来自 oracle jdk 8 发行版。您只需在命令提示符/终端上键入 jvisualvm。如果不是从here下载

    【讨论】:

    • 感谢比努的回复。我已经对 1000 条记录进行了抽样。作业运行时间约为 110 秒。但是当我多次对 CPU 进行采样时,我发现在处理器内部,对于每个记录王 3 个不同的 fetch 调用,这占用了处理器内部大约 80% 的 CPU 时间。我将进行更改以使用 jdbcTemplate 而不是 namedJdbcTemplate 进行提取。附上下面示例的屏幕截图。
    猜你喜欢
    • 1970-01-01
    • 2013-11-05
    • 1970-01-01
    • 2019-06-09
    • 1970-01-01
    • 2014-12-24
    • 1970-01-01
    • 2023-02-24
    • 2016-10-03
    相关资源
    最近更新 更多