Spring 复杂作业的批处理性能改进
Spring Batch Performance Improvement for a complex job
我有一个 Spring 批处理作业,每天 运行 处理大约 10 万条记录。我已将我的批次配置如下。
ItemReader :我使用 JdbcCursorItemReader 从单个 table(这个table有所有的源记录)。 块大小为1000
ItemProcessor :我在这里添加了对每条记录执行验证的逻辑。验证包括检查数据的正确性,一旦验证完成,我将验证 几个 tables(对于此记录)。
ItemWriter :这里我根据验证结果更新了最终的 tables。(这是一个批量操作,我使用了 JdbcTemplate.batchUpdate 以加快处理速度)。
结果:
处理 104000 条记录需要大约 140 分钟。由于这是每天 运行 并且许多其他工作在生产中并行 运行 我想提高这批处理的性能。
有人可以建议一个更好的方法来增强这个批处理吗? (我尝试了 spring 在步骤配置中使用 taskexecutor 批处理提供的多线程方法,但我在 reader 中遇到了一些游标问题,如下所示)
**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
使用 JVisualVm 监控应用程序内部的瓶颈。
既然您说 "for processing 104000 records job took around 140 min",您将更好地了解性能受到影响的地方。
打开 visualvm 连接您的应用程序 => 采样器 => cpu => CPU 样本。
在不同的时间拍摄快照并分析它在哪里花费了很多时间。通过仅选中此选项,您将获得足够的数据进行优化。
注意:JvisualVm 属于 oracle jdk8 发行版。您可以简单地在命令 prompt/terminal 上键入 jvisualvm。如果不是从 here
下载
我有一个 Spring 批处理作业,每天 运行 处理大约 10 万条记录。我已将我的批次配置如下。
ItemReader :我使用 JdbcCursorItemReader 从单个 table(这个table有所有的源记录)。 块大小为1000
ItemProcessor :我在这里添加了对每条记录执行验证的逻辑。验证包括检查数据的正确性,一旦验证完成,我将验证 几个 tables(对于此记录)。
ItemWriter :这里我根据验证结果更新了最终的 tables。(这是一个批量操作,我使用了 JdbcTemplate.batchUpdate 以加快处理速度)。
结果: 处理 104000 条记录需要大约 140 分钟。由于这是每天 运行 并且许多其他工作在生产中并行 运行 我想提高这批处理的性能。
有人可以建议一个更好的方法来增强这个批处理吗? (我尝试了 spring 在步骤配置中使用 taskexecutor 批处理提供的多线程方法,但我在 reader 中遇到了一些游标问题,如下所示)
**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
使用 JVisualVm 监控应用程序内部的瓶颈。 既然您说 "for processing 104000 records job took around 140 min",您将更好地了解性能受到影响的地方。
打开 visualvm 连接您的应用程序 => 采样器 => cpu => CPU 样本。 在不同的时间拍摄快照并分析它在哪里花费了很多时间。通过仅选中此选项,您将获得足够的数据进行优化。
注意:JvisualVm 属于 oracle jdk8 发行版。您可以简单地在命令 prompt/terminal 上键入 jvisualvm。如果不是从 here
下载