首页 > 解决方案 > Spring Batch 的 JdbcJobExecutionDao 中的 getLastJobExecution 在 Oracle 的情况下返回不正确的最后一个作业执行

问题描述

我正在使用 Oracle 序列为作业执行和其他 Spring Batch 元数据表生成唯一 ID。Oracle 对序列使用缓存,因为 id 不一定按顺序或递增顺序(它只保证唯一性)。

在应用程序中,我需要为我使用 SimpleJobExplorer 的 getLastJobExecution 的功能获取最后一个作业实例及其最后一个作业执行,该功能调用 JdbcJobExecutionDaos getLastJobExecution 方法。

问题是 getLastJobExecution 中的查询只是获取具有最大执行 ID 的作业执行作为最后一个作业执行。由于序列在 Oracle 中的工作方式,它返回不正确的作业执行。

问题 :

  1. 为什么 Spring 批处理使用执行 id 而不是开始时间或结束时间来获取最后一个作业执行?我在这里错过了一些案例吗?
  2. Spring批处理中是否有一些API已经可用,可以根据开始时间或结束时间获取最后一个作业执行或最后一个作业实例,还是我必须自己实现它?

标签: spring-batch

解决方案


这里有一个类似的问题:https ://github.com/spring-projects/spring-batch/issues/2000 。

您需要按如下方式订购序列:

CREATE SEQUENCE BATCH_STEP_EXECUTION_SEQ START WITH 0 MINVALUE 0 MAXVALUE 9223372036854775807 NOCYCLE ORDER;
CREATE SEQUENCE BATCH_JOB_EXECUTION_SEQ START WITH 0 MINVALUE 0 MAXVALUE 9223372036854775807 NOCYCLE ORDER;
CREATE SEQUENCE BATCH_JOB_SEQ START WITH 0 MINVALUE 0 MAXVALUE 9223372036854775807 NOCYCLE ORDER;

我们正在考虑将其默认添加到v5 中为 Oracle提供的DDL 。


推荐阅读