元数据架构

附录 A:元数据架构

概述

Spring Batch 元数据表与表示它们的域对象紧密匹配 Java。例如JobInstance,JobExecution,JobParametersStepExecutionmap 到BATCH_JOB_INSTANCE,BATCH_JOB_EXECUTION,BATCH_JOB_EXECUTION_PARAMSBATCH_STEP_EXECUTION分别。ExecutionContext映射到两者BATCH_JOB_EXECUTION_CONTEXTBATCH_STEP_EXECUTION_CONTEXT.这JobRepository是 负责将每个 Java 对象保存并存储到其正确的表中。本附录 详细介绍了元数据表,以及许多设计决策 是在创建它们时创建的。查看描述的各种表创建语句时 在本附录的后面部分,请注意所使用的数据类型尽可能通用。Spring Batch 提供了许多 schema 作为示例。它们都具有不同的数据类型,因为 各个数据库供应商处理数据类型的方式各不相同。下图 显示了所有六个表的 ERD 模型及其彼此之间的关系:spring-doc.cadn.net.cn

Spring Batch 元数据 ERD
图 1.Spring Batch 元数据 ERD

DDL 脚本示例

Spring Batch Core JAR 文件包含用于创建关系表的示例脚本 对于许多数据库平台(反过来,这些平台由 Job 自动检测 repository factory bean 或等效命名空间)。这些脚本可以按原样使用 或 根据需要使用其他索引和约束进行修改。文件名位于 形式schema-*.sql,其中 是目标数据库平台的简称。 脚本位于包中*org.springframework.batch.core.spring-doc.cadn.net.cn

迁移 DDL 脚本

Spring Batch 提供了迁移 DDL 脚本,升级版本时需要执行这些脚本。 这些脚本可以在 Core Jar 文件中找到,位于org/springframework/batch/core/migration. 迁移脚本被组织到与引入它们的版本号相对应的文件夹中:spring-doc.cadn.net.cn

版本

本附录中讨论的许多数据库 table 都包含 version 列。这 列很重要,因为 Spring Batch 在 处理数据库的更新。这意味着每次 “touched” 记录时 (updated) 时,version 列中的值将递增 1。当仓库 back 来保存值,如果版本号已经改变,它会抛出一个OptimisticLockingFailureException,指示 concurrent 存在错误 访问。此检查是必要的,因为即使可能正在运行不同的批处理作业 在不同的机器中,它们都使用相同的数据库表。spring-doc.cadn.net.cn

身份

BATCH_JOB_INSTANCE,BATCH_JOB_EXECUTIONBATCH_STEP_EXECUTION每个包含 以_ID.这些字段充当其各自表的主键。 但是,它们不是数据库生成的键。相反,它们是由单独的 序列。这是必要的,因为在将其中一个域对象插入 database 中,需要对实际对象设置给定的 key,以便它们可以 在 Java 中唯一标识。较新的数据库驱动程序(JDBC 3.0 及更高版本)支持此功能 功能。但是,不需要该功能, 序列。架构的每个变体都包含以下某种形式的内容 语句:spring-doc.cadn.net.cn

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

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

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,然后将此序列中的一列递增为 提供类似的功能。spring-doc.cadn.net.cn

BATCH_JOB_INSTANCE桌子

BATCH_JOB_INSTANCEtable 包含与JobInstance和 充当整个层次结构的顶部。使用以下通用 DDL 语句 要创建它:spring-doc.cadn.net.cn

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
);

以下列表描述了表中的每一列:spring-doc.cadn.net.cn

  • JOB_INSTANCE_ID:标识实例的唯一 ID。它也是主要的 钥匙。此列的值应可通过调用getIdmethod 开启JobInstance.spring-doc.cadn.net.cn

  • VERSION:请参阅版本spring-doc.cadn.net.cn

  • JOB_NAME:从Job对象。因为它需要 标识实例,则它不能为 null。spring-doc.cadn.net.cn

  • JOB_KEY:的序列化JobParameters,唯一标识单独的 同一作业的实例。(JobInstances具有相同的作业名称 具有不同的JobParameters因此,不同JOB_KEY值)。spring-doc.cadn.net.cn

BATCH_JOB_EXECUTION_PARAMS桌子

BATCH_JOB_EXECUTION_PARAMStable 包含与JobParameters对象。它包含传递给Job和 用作运行作业时使用的参数的记录。对于每个参数 有助于生成作业的身份,则IDENTIFYINGflag 设置为 true。 请注意,该表已非规范化。而不是为每个 type 中,有一个表,其中有一列指示类型,如下所示 列表显示:spring-doc.cadn.net.cn

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)
);

以下列表描述了每一列:spring-doc.cadn.net.cn

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

BATCH_JOB_EXECUTION桌子

BATCH_JOB_EXECUTIONtable 包含与JobExecution对象。每次Job运行时,总会有一个名为JobExecution和 这个表。下面的清单显示了BATCH_JOB_EXECUTION桌子:spring-doc.cadn.net.cn

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)
) ;

以下列表描述了每一列:spring-doc.cadn.net.cn

  • JOB_EXECUTION_ID:唯一标识此执行的主键。的值 此列可通过调用getId方法JobExecution对象。spring-doc.cadn.net.cn

  • VERSION:请参阅版本spring-doc.cadn.net.cn

  • JOB_INSTANCE_ID:来自BATCH_JOB_INSTANCE桌子。它表示 实例。每个 实例。spring-doc.cadn.net.cn

  • CREATE_TIME:表示创建执行的时间的时间戳。spring-doc.cadn.net.cn

  • START_TIME:表示执行开始时间的时间戳。spring-doc.cadn.net.cn

  • END_TIME:表示执行完成时间的时间戳,无论 成功或失败。当作业当前未运行时,此列中的空值 表示存在某种类型的错误,并且框架无法执行 失败前的最后一次保存。spring-doc.cadn.net.cn

  • STATUS:表示执行状态的字符串。这可能是COMPLETED,STARTED等。此列的对象表示形式是BatchStatus列举。spring-doc.cadn.net.cn

  • EXIT_CODE:表示执行的退出代码的字符串。在案例中 中,这可以转换为数字。spring-doc.cadn.net.cn

  • EXIT_MESSAGE:字符串,表示 作业已退出。在失败的情况下,这可能包括尽可能多的堆栈跟踪 可能。spring-doc.cadn.net.cn

  • LAST_UPDATED:表示上次保留此执行的时间戳。spring-doc.cadn.net.cn

BATCH_STEP_EXECUTION桌子

BATCH_STEP_EXECUTIONtable 包含与StepExecution对象。此表在许多方面与BATCH_JOB_EXECUTION表,然后 始终每个Step对于每个JobExecution创建。以下内容 清单显示了BATCH_STEP_EXECUTION桌子:spring-doc.cadn.net.cn

CREATE TABLE BATCH_STEP_EXECUTION  (
  STEP_EXECUTION_ID BIGINT NOT NULL PRIMARY KEY ,
  VERSION BIGINT NOT NULL,
  STEP_NAME VARCHAR(100) NOT NULL,
  JOB_EXECUTION_ID BIGINT NOT NULL,
  CREATE_TIME TIMESTAMP NOT NULL,
  START_TIME TIMESTAMP DEFAULT 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)
) ;

以下列表描述了每一列:spring-doc.cadn.net.cn

  • STEP_EXECUTION_ID:唯一标识此执行的主键。的值 此列应可通过调用getId方法StepExecution对象。spring-doc.cadn.net.cn

  • VERSION:请参阅版本spring-doc.cadn.net.cn

  • STEP_NAME:此执行所属的步骤的名称。spring-doc.cadn.net.cn

  • JOB_EXECUTION_ID:来自BATCH_JOB_EXECUTION桌子。它表示JobExecutionStepExecution是。可能只有一个StepExecution对于给定的JobExecution对于给定的Step名字。spring-doc.cadn.net.cn

  • START_TIME:表示执行开始时间的时间戳。spring-doc.cadn.net.cn

  • END_TIME:表示执行完成时间的时间戳,无论 成功或失败。此列中的空值,即使作业不是 currently running,表示存在某种类型的错误,并且框架 无法在失败之前执行最后一次保存。spring-doc.cadn.net.cn

  • STATUS:表示执行状态的字符串。这可能是COMPLETED,STARTED等。此列的对象表示形式是BatchStatus列举。spring-doc.cadn.net.cn

  • COMMIT_COUNT:步骤提交事务的次数 在此执行期间。spring-doc.cadn.net.cn

  • READ_COUNT:此执行期间读取的项目数。spring-doc.cadn.net.cn

  • FILTER_COUNT:从此执行中筛选出的项目数。spring-doc.cadn.net.cn

  • WRITE_COUNT:此执行期间写入和提交的项目数。spring-doc.cadn.net.cn

  • READ_SKIP_COUNT:此执行期间读取时跳过的项目数。spring-doc.cadn.net.cn

  • WRITE_SKIP_COUNT:此执行期间写入时跳过的项目数。spring-doc.cadn.net.cn

  • PROCESS_SKIP_COUNT:在此期间处理过程中跳过的项目数 执行。spring-doc.cadn.net.cn

  • ROLLBACK_COUNT:此执行期间的回滚次数。请注意,此计数 包括每次发生回滚的时间,包括重试的回滚和跳过中的回滚 恢复程序。spring-doc.cadn.net.cn

  • EXIT_CODE:表示执行的退出代码的字符串。在案例中 中,这可以转换为数字。spring-doc.cadn.net.cn

  • EXIT_MESSAGE:字符串,表示 作业已退出。在失败的情况下,这可能包括尽可能多的堆栈跟踪 可能。spring-doc.cadn.net.cn

  • LAST_UPDATED:表示上次保留此执行的时间戳。spring-doc.cadn.net.cn

BATCH_JOB_EXECUTION_CONTEXT桌子

BATCH_JOB_EXECUTION_CONTEXTtable 包含与ExecutionContextJob.正好有一个Job ExecutionContext对于每个JobExecution,它包含特定 任务执行。此数据通常表示必须在 failure,因此JobInstance可以 “从上次中断的地方开始”。以下内容 清单显示了BATCH_JOB_EXECUTION_CONTEXT桌子:spring-doc.cadn.net.cn

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)
) ;

以下列表描述了每一列:spring-doc.cadn.net.cn

BATCH_STEP_EXECUTION_CONTEXT桌子

BATCH_STEP_EXECUTION_CONTEXTtable 包含与ExecutionContextStep.正好有一个ExecutionContextStepExecution,它包含所有 需要为特定步骤执行保留。此数据通常表示 状态,以便在失败后必须检索JobInstance可以“启动 它停止的地方”。下面的清单显示了BATCH_STEP_EXECUTION_CONTEXT桌子:spring-doc.cadn.net.cn

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)
) ;

以下列表描述了每一列:spring-doc.cadn.net.cn

归档

由于每次运行批处理作业时,多个表中都有条目,因此这种情况很常见 为元数据表创建存档策略。桌子本身是设计 显示过去发生的事情的记录,并且通常不会影响任何 Job 的 Job,但有一些与 restart 相关的显著例外:spring-doc.cadn.net.cn

  • 框架使用元数据表来确定特定的JobInstance之前已经运行过。如果已运行且作业不可重启,则 异常。spring-doc.cadn.net.cn

  • 如果JobInstance在未成功完成的情况下被删除,则 框架认为作业是新的,而不是重新启动的。spring-doc.cadn.net.cn

  • 如果重新启动作业,框架将使用已持久化到ExecutionContext要恢复Job’s州。因此,从 此表适用于未成功完成的作业,可防止它们从 如果它们再次运行,则为正确的点。spring-doc.cadn.net.cn

国际字符和多字节字符

如果您在企业中使用多字节字符集(例如中文或西里尔文) 处理时,这些字符可能需要保留在 Spring Batch 架构中。 许多用户发现,只需将 schema 更改为VARCHARcolumns 就足够了。其他人更喜欢使用max-varchar-length一半 的值VARCHARcolumn length 的一些用户还报告说,他们使用NVARCHAR代替VARCHAR在其 schema 定义中。最佳结果取决于 数据库平台和数据库服务器在本地配置的方式。spring-doc.cadn.net.cn

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

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

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

默认表名称spring-doc.cadn.net.cn

Where 子句spring-doc.cadn.net.cn

频率spring-doc.cadn.net.cn

BATCH_JOB_INSTANCEspring-doc.cadn.net.cn

JOB_NAME = ? and JOB_KEY = ?spring-doc.cadn.net.cn

每次启动作业时spring-doc.cadn.net.cn

BATCH_JOB_EXECUTIONspring-doc.cadn.net.cn

JOB_INSTANCE_ID = ?spring-doc.cadn.net.cn

每次重启作业时spring-doc.cadn.net.cn

BATCH_STEP_EXECUTIONspring-doc.cadn.net.cn

VERSION = ?spring-doc.cadn.net.cn

在提交间隔上,又名 chunk(以及 步骤)spring-doc.cadn.net.cn

BATCH_STEP_EXECUTIONspring-doc.cadn.net.cn

STEP_NAME = ? and JOB_EXECUTION_ID = ?spring-doc.cadn.net.cn

在每个步骤执行之前spring-doc.cadn.net.cn