Spring Batch -元数据模式

时间:2022-12-19 10:59:27

Spring Batch -元数据模式

Spring 批处理元数据表与表示它们的域对象非常匹配 爪哇岛。例如,、、 和 分别映射到 、 和 。 映射到 和 。这是 负责将每个 Java 对象保存并存储到正确的表中。本附录 详细介绍了元数据表,以及许多设计决策 是在创建它们时制作的。查看描述的各种表创建语句时 在本附录的后面部分,请注意,使用的数据类型尽可能通用。春天 批处理提供了许多架构作为示例。它们都具有不同的数据类型,由于 各个数据库供应商处理数据类型的方式有所不同。下图 显示了所有六个表的 ERD 模型及其相互关系:​​JobInstance​​​​JobExecution​​​​JobParameters​​​​StepExecution​​​​BATCH_JOB_INSTANCE​​​​BATCH_JOB_EXECUTION​​​​BATCH_JOB_EXECUTION_PARAMS​​​​BATCH_STEP_EXECUTION​​​​ExecutionContext​​​​BATCH_JOB_EXECUTION_CONTEXT​​​​BATCH_STEP_EXECUTION_CONTEXT​​​​JobRepository​

Spring Batch -元数据模式

图1.春季批处理元数据 ERD

DDL 脚本示例

Spring Batch Core JAR 文件包含用于创建关系表的示例脚本 对于许多数据库平台(这些平台又由作业自动检测) 存储库工厂 Bean 或命名空间等效项)。这些脚本可以按原样使用,也可以 根据需要使用其他索引和约束进行修改。文件名位于 窗体 ,其中 是目标数据库平台的短名称。 脚本在包中。​​schema-*.sql​​​​*​​​​org.springframework.batch.core​

迁移 DDL 脚本

Spring 批处理提供了升级版本时需要执行的迁移 DDL 脚本。 这些脚本可以在 下的核心 Jar 文件中找到。 迁移脚本被组织到与引入它们的版本号相对应的文件夹中:​​org/springframework/batch/core/migration​

  • ​2.2​​:包含需要从以前的版本迁移到版本的脚本2.22.2
  • ​4.1​​:包含需要从以前的版本迁移到版本的脚本4.14.1

版本

本附录中讨论的许多数据库表都包含版本列。这 列很重要,因为 Spring Batch 在以下情况下采用乐观锁定策略 处理数据库的更新。这意味着每次“触摸”记录时 (更新),“版本”列中的值将递增 1。当存储库消失时 返回以保存值,如果版本号已更改,则会抛出一个 ,表示并发时出错 访问。此检查是必要的,因为即使不同的批处理作业可能正在运行 在不同的机器中,它们都使用相同的数据库表。​​OptimisticLockingFailureException​

身份

​BATCH_JOB_INSTANCE​​、 和 每个都包含 以 结尾的列。这些字段充当其各自表的主键。 但是,它们不是数据库生成的键。相反,它们是由单独的 序列。这是必要的,因为在将其中一个域对象插入 数据库,它给出的键需要在实际对象上设置,以便它们可以 在 Java 中唯一标识。较新的数据库驱动程序(JDBC 3.0 及更高版本)支持此功能 具有数据库生成的密钥的功能。但是,不是需要该功能, 使用序列。架构的每个变体都包含以下某种形式 语句:​​BATCH_JOB_EXECUTION​​​​BATCH_STEP_EXECUTION​​​​_ID​

CREATE SEQUENCE BATCH_STEP_EXECUTION_SEQ;
CREATE SEQUENCE BATCH_JOB_EXECUTION_SEQ;
CREATE SEQUENCE BATCH_JOB_SEQ;

许多数据库供应商不支持序列。在这些情况下,使用解决方法, 例如以下 MySQL 语句:

CREATE TABLE BATCH_STEP_EXECUTION_SEQ (ID BIGINT NOT NULL) type=InnoDB;
INSERT INTO BATCH_STEP_EXECUTION_SEQ values(0);
CREATE TABLE BATCH_JOB_EXECUTION_SEQ (ID BIGINT NOT NULL) type=InnoDB;
INSERT INTO BATCH_JOB_EXECUTION_SEQ values(0);
CREATE TABLE BATCH_JOB_SEQ (ID BIGINT NOT NULL) type=InnoDB;
INSERT INTO BATCH_JOB_SEQ values(0);

在前面的情况下,使用表代替每个序列。Spring 核心类,然后将此序列中的一列递增为 提供类似的功能。​​MySQLMaxValueIncrementer​

目录​​BATCH_JOB_INSTANCE​

该表包含与 和 作为整个层次结构的顶部。使用以下通用 DDL 语句 要创建它:​​BATCH_JOB_INSTANCE​​​​JobInstance​

CREATE TABLE BATCH_JOB_INSTANCE  (
JOB_INSTANCE_ID BIGINT PRIMARY KEY ,
VERSION BIGINT,
JOB_NAME VARCHAR(100) NOT NULL ,
JOB_KEY VARCHAR(32) NOT NULL
);

以下列表描述了表中的每一列:

  • ​JOB_INSTANCE_ID​​:标识实例的唯一 ID。它也是主要的 .key。此列的值应该可以通过调用 上的方法来获取。getIdJobInstance
  • ​VERSION​​:请参阅版本。
  • ​JOB_NAME​​:从对象获取的作业的名称。因为它需要 标识实例,它不能为 null。Job
  • ​JOB_KEY​​:唯一标识单独 的序列化 彼此之间的相同作业的实例。( 具有相同的作业名称必须 具有不同的值,因此具有不同的值)。JobParametersJobInstancesJobParametersJOB_KEY

目录​​BATCH_JOB_EXECUTION_PARAMS​

该表包含与对象相关的所有信息。它包含 0 个或多个传递给 和 作为运行作业时使用的参数的记录。对于每个参数 有助于生成作业的标识,该标志设置为 true。 请注意,该表已非规范化。而不是为每个表创建一个单独的表 type,有一个表,其中有一列指示类型,如下所示 房源显示:​​BATCH_JOB_EXECUTION_PARAMS​​​​JobParameters​​​​Job​​​​IDENTIFYING​

CREATE TABLE BATCH_JOB_EXECUTION_PARAMS  (
JOB_EXECUTION_ID BIGINT NOT NULL ,
PARAMETER_NAME VARCHAR(100) NOT NULL ,
PARAMETER_TYPE VARCHAR(100) NOT NULL ,
PARAMETER_VALUE VARCHAR(2500) ,
IDENTIFYING CHAR(1) NOT NULL ,
constraint JOB_EXEC_PARAMS_FK foreign key (JOB_EXECUTION_ID)
references BATCH_JOB_EXECUTION(JOB_EXECUTION_ID)
);

以下列表描述了每个列:

  • ​JOB_EXECUTION_ID​​:表中指示 参数条目所属的作业执行。请注意,多行(即 键/值对)对于每个执行都可能存在。BATCH_JOB_EXECUTION
  • PARAMETER_NAME:参数名称。
  • PARAMETER_TYPE:参数类型的完全限定名。
  • PARAMETER_VALUE:参数值
  • 标识:指示参数是否有助于标识的标志 相关。JobInstance

请注意,此表没有主键。这是因为框架没有 用于一个,因此不需要它。如果需要,可以添加主键 使用数据库生成的密钥,而不会对框架本身造成任何问题。

目录​​BATCH_JOB_EXECUTION​

该表包含与对象相关的所有信息。每次运行 a 时,总会有一个新的调用和一个新的行 此表。下面的清单显示了表的定义:​​BATCH_JOB_EXECUTION​​​​JobExecution​​​​Job​​​​JobExecution​​​​BATCH_JOB_EXECUTION​

CREATE TABLE BATCH_JOB_EXECUTION  (
JOB_EXECUTION_ID BIGINT PRIMARY KEY ,
VERSION BIGINT,
JOB_INSTANCE_ID BIGINT NOT NULL,
CREATE_TIME TIMESTAMP NOT NULL,
START_TIME TIMESTAMP DEFAULT NULL,
END_TIME TIMESTAMP DEFAULT NULL,
STATUS VARCHAR(10),
EXIT_CODE VARCHAR(20),
EXIT_MESSAGE VARCHAR(2500),
LAST_UPDATED TIMESTAMP,
constraint JOB_INSTANCE_EXECUTION_FK foreign key (JOB_INSTANCE_ID)
references BATCH_JOB_INSTANCE(JOB_INSTANCE_ID)
) ;

以下列表描述了每个列:

  • ​JOB_EXECUTION_ID​​:唯一标识此执行的主键。的价值 此列可通过调用对象的方法获取。getIdJobExecution
  • ​VERSION​​:请参阅版本。
  • ​JOB_INSTANCE_ID​​:表中的外键。它表示 此执行所属的实例。每个执行可能有多个执行 实例。BATCH_JOB_INSTANCE
  • ​CREATE_TIME​​:表示创建执行的时间的时间戳。
  • ​START_TIME​​:表示执行开始时间的时间戳。
  • ​END_TIME​​:表示执行完成时间的时间戳,与 成功或失败。作业当前未运行时此列中的空值 指示存在某种类型的错误,并且框架无法执行 失败前的最后一次保存。
  • ​STATUS​​:表示执行状态的字符串。这可能是 、 和其他。此列的对象表示形式是枚举。COMPLETEDSTARTEDBatchStatus
  • ​EXIT_CODE​​:表示执行的退出代码的字符串。在这种情况下 的命令行作业,这可以转换为数字。
  • ​EXIT_MESSAGE​​:表示如何更详细描述的字符串 作业已退出。在失败的情况下,这可能包括尽可能多的堆栈跟踪 可能。
  • ​LAST_UPDATED​​:表示上次保留此执行时间的时间戳。

目录​​BATCH_STEP_EXECUTION​

该表包含与对象相关的所有信息。此表在许多方面与该表相似,并且有 对于每个创建的条目,始终至少有一个条目。以下 列表显示了表的定义:​​BATCH_STEP_EXECUTION​​​​StepExecution​​​​BATCH_JOB_EXECUTION​​​​Step​​​​JobExecution​​​​BATCH_STEP_EXECUTION​

CREATE TABLE BATCH_STEP_EXECUTION  (
STEP_EXECUTION_ID BIGINT PRIMARY KEY ,
VERSION BIGINT NOT NULL,
STEP_NAME VARCHAR(100) NOT NULL,
JOB_EXECUTION_ID BIGINT NOT NULL,
START_TIME TIMESTAMP NOT NULL ,
END_TIME TIMESTAMP DEFAULT NULL,
STATUS VARCHAR(10),
COMMIT_COUNT BIGINT ,
READ_COUNT BIGINT ,
FILTER_COUNT BIGINT ,
WRITE_COUNT BIGINT ,
READ_SKIP_COUNT BIGINT ,
WRITE_SKIP_COUNT BIGINT ,
PROCESS_SKIP_COUNT BIGINT ,
ROLLBACK_COUNT BIGINT ,
EXIT_CODE VARCHAR(20) ,
EXIT_MESSAGE VARCHAR(2500) ,
LAST_UPDATED TIMESTAMP,
constraint JOB_EXECUTION_STEP_FK foreign key (JOB_EXECUTION_ID)
references BATCH_JOB_EXECUTION(JOB_EXECUTION_ID)
) ;

以下列表描述了每个列:

  • ​STEP_EXECUTION_ID​​:唯一标识此执行的主键。的价值 此列应该可以通过调用对象的方法获得。getIdStepExecution
  • ​VERSION​​:请参阅版本
  • ​STEP_NAME​​:此执行所属步骤的名称。
  • ​JOB_EXECUTION_ID​​:表中的外键。它表示它所属的。给定的名称可能只有一个。BATCH_JOB_EXECUTIONJobExecutionStepExecutionStepExecutionJobExecutionStep
  • ​START_TIME​​:表示执行开始时间的时间戳。
  • ​END_TIME​​:表示执行完成时间的时间戳,无论 成功或失败。此列中的空值,即使作业不是 当前正在运行,指示存在某种类型的错误,并且框架是 无法在失败之前执行上次保存。
  • ​STATUS​​:表示执行状态的字符串。这可能是 、 和其他。此列的对象表示形式是枚举。COMPLETEDSTARTEDBatchStatus
  • ​COMMIT_COUNT​​:步骤提交事务的次数 在此执行期间。
  • ​READ_COUNT​​:此执行期间读取的项目数。
  • ​FILTER_COUNT​​:从此执行中筛选出的项目数。
  • ​WRITE_COUNT​​:此执行期间写入和提交的项目数。
  • ​READ_SKIP_COUNT​​:此执行期间读取时跳过的项目数。
  • ​WRITE_SKIP_COUNT​​:此执行期间写入时跳过的项目数。
  • ​PROCESS_SKIP_COUNT​​:在此期间处理过程中跳过的项目数 执行。
  • ​ROLLBACK_COUNT​​:此执行期间的回滚次数。请注意,此计数 包括每次回滚发生的时间,包括重试的回滚和跳过中的回滚 恢复过程。
  • ​EXIT_CODE​​:表示执行的退出代码的字符串。在这种情况下 的命令行作业,这可以转换为数字。
  • ​EXIT_MESSAGE​​:表示如何更详细描述的字符串 作业已退出。在失败的情况下,这可能包括尽可能多的堆栈跟踪 可能。
  • ​LAST_UPDATED​​:表示上次保留此执行时间的时间戳。

目录​​BATCH_JOB_EXECUTION_CONTEXT​

该表包含与 .每个只有一个,它包含特定所需的所有作业级数据 作业执行。此数据通常表示在 失败,以便 A 可以“从中断的地方开始”。以下 列表显示了表的定义:​​BATCH_JOB_EXECUTION_CONTEXT​​​​ExecutionContext​​​​Job​​​​Job​​​​ExecutionContext​​​​JobExecution​​​​JobInstance​​​​BATCH_JOB_EXECUTION_CONTEXT​

CREATE TABLE BATCH_JOB_EXECUTION_CONTEXT  (
JOB_EXECUTION_ID BIGINT PRIMARY KEY,
SHORT_CONTEXT VARCHAR(2500) NOT NULL,
SERIALIZED_CONTEXT CLOB,
constraint JOB_EXEC_CTX_FK foreign key (JOB_EXECUTION_ID)
references BATCH_JOB_EXECUTION(JOB_EXECUTION_ID)
) ;

以下列表描述了每个列:

  • ​JOB_EXECUTION_ID​​:表示上下文的外键 是。可能有多个行与给定执行相关联。JobExecution
  • ​SHORT_CONTEXT​​:字符串版本的 。SERIALIZED_CONTEXT
  • ​SERIALIZED_CONTEXT​​:序列化的整个上下文。

目录​​BATCH_STEP_EXECUTION_CONTEXT​

该表包含与 .每个只有一个,它包含所有的数据 需要为特定步骤执行持久化。此数据通常表示 失败后必须检索的状态,以便 可以“启动” 它离开的地方”。下面的清单显示了表的定义:​​BATCH_STEP_EXECUTION_CONTEXT​​​​ExecutionContext​​​​Step​​​​ExecutionContext​​​​StepExecution​​​​JobInstance​​​​BATCH_STEP_EXECUTION_CONTEXT​

CREATE TABLE BATCH_STEP_EXECUTION_CONTEXT  (
STEP_EXECUTION_ID BIGINT PRIMARY KEY,
SHORT_CONTEXT VARCHAR(2500) NOT NULL,
SERIALIZED_CONTEXT CLOB,
constraint STEP_EXEC_CTX_FK foreign key (STEP_EXECUTION_ID)
references BATCH_STEP_EXECUTION(STEP_EXECUTION_ID)
) ;

以下列表描述了每个列:

  • ​STEP_EXECUTION_ID​​:表示上下文的外键 是。可能有多个行与给定执行相关联。StepExecution
  • ​SHORT_CONTEXT​​:字符串版本的 。SERIALIZED_CONTEXT
  • ​SERIALIZED_CONTEXT​​:序列化的整个上下文。

归档

由于每次运行批处理作业时,多个表中都有条目,因此很常见 为元数据表创建存档策略。桌子本身是设计好的 显示过去发生的事情的记录,并且通常不会影响任何 作业,但与重新启动相关的一些值得注意的例外情况除外:

  • 框架使用元数据表来确定以前是否运行过特定。如果它已运行并且作业不可重新启动,则 引发异常。JobInstance
  • 如果 的条目在未成功完成的情况下被删除,则 框架认为作业是新的,而不是重新启动的。JobInstance
  • 如果重新启动作业,框架将使用已保存到 的任何数据来还原状态。因此,从中删除任何条目 此表显示未成功完成的作业可防止它们在 如果再次运行它们,则是正确的点。ExecutionContextJob’s

国际字符和多字节字符

如果您在商家中使用多字节字符集(例如中文或西里尔文) 处理中,这些字符可能需要保留在 Spring 批处理架构中。 许多用户发现,只需更改架构以将列的长度加倍就足够了。其他人更喜欢用一半的 列长度的值。一些用户还报告说,他们使用来代替架构定义中的 。最佳结果取决于 数据库平台和数据库服务器在本地配置的方式。​​VARCHAR​​​​max-varchar-length​​​​VARCHAR​​​​NVARCHAR​​​​VARCHAR​

为元数据表编制索引的建议

Spring Batch 为核心 jar 文件中的元数据表提供了 DDL 示例 几个常见的数据库平台。索引声明不包括在该 DDL 中, 因为用户可能希望如何编制索引存在太多变化,具体取决于他们的 精确的平台、当地惯例以及工作方式的业务需求 操作。下表提供了有关哪些列将要转到的一些指示 由Spring Batch提供的DAO实现在子句中使用以及如何使用 经常使用它们,以便单个项目可以自己决定 关于索引:​​WHERE​

表 1.SQL 语句中的 where 子句(不包括主键)及其大致使用频率。

默认表名

其中条款

频率

​BATCH_JOB_INSTANCE​

​JOB_NAME = ? and JOB_KEY = ?​

每次启动作业时

​BATCH_JOB_EXECUTION​

​JOB_INSTANCE_ID = ?​

每次重新启动作业时

​BATCH_STEP_EXECUTION​

​VERSION = ?​

在提交间隔时,又称块(以及 步骤)

​BATCH_STEP_EXECUTION​

​STEP_NAME = ? and JOB_EXECUTION_ID = ?​

执行每个步骤之前