领先一步
VMware 提供培训和认证,以加快您的进度。
了解更多代表 Spring Batch 团队,我很高兴地宣布 Spring Batch 4.2.0.RC1 版本发布。我们一直在核心框架中进行一些性能改进,这篇文章重点介绍了主要变化。
我们进行了一些性能改进,包括:
启动分区步骤是框架未得到很好优化的一个领域。在这个版本中,我们深入研究了分区过程,以找出此性能问题的根本原因。分区过程的主要步骤之一是查找上一步执行(查看当前执行是否为重新启动)。我们发现查找上一步执行涉及将给定作业实例的所有作业执行中的所有步骤执行加载到内存中,这显然效率低下!
我们用一个在数据库级别进行查找的 SQL 查询替换了这段代码,以仅返回上一步执行。根据我们的基准测试partitioned-step-benchmark,结果非常出色:将步骤执行划分为 5000 个分区,使用这种方法的速度几乎快了 10 倍。
运行作业时可能会出现问题……为了避免数据损坏,优雅地停止破坏性作业应该快速有效。直到 v4.1 版本,使用CommandLineJobRunner
停止作业的性能都很差,因为需要将所有作业执行加载到内存中才能查找当前是否正在运行作业执行。使用这种方法,对于拥有数千个作业执行的生产数据库,停止作业可能需要几分钟!
在这个版本中,我们通过使用在数据库级别进行过滤的 SQL 查询来优化停止过程。同样,结果令人印象深刻:根据我们的基准测试stop-benchmark,数据库中存在给定作业的 100,000 个作业执行时,使用这种方法停止作业的速度几乎快了 40 倍。
JpaItemWriter
加快写入速度JpaItemWriter
使用javax.persistence.EntityManager#merge
函数将项目写入 JPA 持久性上下文。当项目的持久状态未知或已知为更新时,这样做是有意义的。但是,在许多数据已知为新的且应视为插入的文件导入作业中,使用javax.persistence.EntityManager#merge
效率不高。
在这个版本中,我们在JpaItemWriter
中引入了一个新选项,以便在这种情况下使用persist
而不是merge
。根据我们的基准测试jpa-writer-benchmark,使用此新选项,使用JpaItemWriter
将 100 万个项目插入数据库的文件导入作业速度提高了 2 倍。
BeanWrapperFieldSetMapper
优化 Bean 映射BeanWrapperFieldSetMapper
提供了一个不错的功能,允许我们使用给定 JavaBean 的字段名称的模糊匹配(驼峰命名法、嵌套属性等)。但是,当字段名称与列名称匹配时,可以通过将distanceLimit
参数设置为 0 来启用精确匹配。
在这个版本中,我们修复了BeanWrapperFieldSetMapper
中的一个性能问题,即使请求精确匹配(通过设置distanceLimit=0
),它也使用反射在每次迭代中内省字段名称。根据我们的 JMH 基准测试bean-mapping-benchmark,结果是项目映射现在比以前版本快 1.5 倍。
请注意,这些数字在您的情况下可能会有所不同。我们鼓励您尝试 Spring Batch 4.2.0.RC1(可以使用 Spring Boot 2.2.0.M6 使用)并分享您的反馈。请参阅4.2.0.RC1和4.2.0.M3版本的更改日志,了解完整的更改列表。
随时通过 Twitter 联系@michaelminella或@b_e_n_a_s,或在StackOverflow或Gitter上提问。如果您发现任何问题,请在Jira上提交工单。
我们计划稳定这个新的候选版本,用于即将于 2019 年 9 月 30 日发布的 Spring Batch 4.2.0.RELEASE 版本。敬请期待!
所有基准测试均在 Macbook Pro 16Go RAM、2.9 GHz 英特尔酷睿 i7 CPU、MacOS Mojave 10.14.5、Oracle JDK 1.8.0_201 上执行。您可以在以下链接中找到所有基准测试的源代码: