元数据架构
附录 A:元数据架构
概述
Spring Batch 元数据表与表示它们的域对象紧密匹配
Java。例如, , , , 和 分别映射到 、 、 和 。 映射到 和 。的
负责将每个 Java 对象保存并存储到其正确的表中。本附录
详细介绍了元数据表,以及许多设计决策
是在创建它们时创建的。查看描述的各种表创建语句时
在本附录的后面部分,请注意所使用的数据类型尽可能通用。Spring
Batch 提供了许多 schema 作为示例。它们都具有不同的数据类型,因为
各个数据库供应商处理数据类型的方式各不相同。下图
显示了所有六个表的 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
DDL 脚本示例
Spring Batch Core JAR 文件包含用于创建关系表的示例脚本
对于许多数据库平台(反过来,这些平台由 Job 自动检测
repository factory bean 或等效命名空间)。这些脚本可以按原样使用 或
根据需要使用其他索引和约束进行修改。文件名位于
form ,其中 是目标数据库平台的简称。
脚本位于包 中。schema-*.sql
*
org.springframework.batch.core
迁移 DDL 脚本
Spring Batch 提供了迁移 DDL 脚本,升级版本时需要执行这些脚本。
这些脚本可以在 Core Jar 文件中找到。
迁移脚本被组织到与引入它们的版本号相对应的文件夹中:org/springframework/batch/core/migration
-
2.2
:包含您需要从 之前的版本迁移到 的脚本2.2
2.2
-
4.1
:包含您需要从 之前的版本迁移到 的脚本4.1
4.1
版本
本附录中讨论的许多数据库 table 都包含 version 列。这
列很重要,因为 Spring Batch 在
处理数据库的更新。这意味着每次 “touched” 记录时
(updated) 时,version 列中的值将递增 1。当仓库
back 保存该值,如果版本号已更改,则会抛出一个 ,表示 concurrent 出现错误
访问。此检查是必要的,因为即使可能正在运行不同的批处理作业
在不同的机器中,它们都使用相同的数据库表。OptimisticLockingFailureException
身份
BATCH_JOB_INSTANCE
、 和 每个包含
以 . 结尾的列。这些字段充当其各自表的主键。
但是,它们不是数据库生成的键。相反,它们是由单独的
序列。这是必要的,因为在将其中一个域对象插入
database 中,需要对实际对象设置给定的 key,以便它们可以
在 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
该表包含与 a 和
充当整个层次结构的顶部。使用以下通用 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。它也是主要的 钥匙。此列的值应可通过调用 on 的方法获得。getId
JobInstance
-
VERSION
:请参阅版本。 -
JOB_NAME
:从对象获取的作业的名称。因为它需要 标识实例,则它不能为 null。Job
-
JOB_KEY
:唯一标识单独 同一作业的实例。( 必须具有相同的作业名称 具有不同的值,因此也不同)。JobParameters
JobInstances
JobParameters
JOB_KEY
桌子BATCH_JOB_EXECUTION_PARAMS
该表包含与对象相关的所有信息。它包含传递给 a 和
用作运行作业时使用的参数的记录。对于每个参数
有助于生成作业的身份,则该标志设置为 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
:表中的外键,指示 参数条目所属的任务执行。请注意,多行(即 键/值对)的 Alpha 值对)。BATCH_JOB_EXECUTION
-
PARAMETER_NAME:参数名称。
-
PARAMETER_TYPE:参数类型的完全限定名称。
-
PARAMETER_VALUE:参数值
-
IDENTIFYING:指示参数是否有助于 相关。
JobInstance
请注意,此表没有主键。这是因为框架没有 用于 1,因此不需要它。如果需要,您可以添加主键 使用数据库生成的密钥,而不会对框架本身造成任何问题。
桌子BATCH_JOB_EXECUTION
该表包含与对象相关的所有信息。每次运行 a 时,总会有一个新的被调用和一个新的 row in
这个表。下面的清单显示了 table 的定义: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
:唯一标识此执行的主键。的值 此列可通过调用 Object 的方法获得。getId
JobExecution
-
VERSION
:请参阅版本。 -
JOB_INSTANCE_ID
:表中的外键。它表示 实例。每个 实例。BATCH_JOB_INSTANCE
-
CREATE_TIME
:表示创建执行的时间的时间戳。 -
START_TIME
:表示执行开始时间的时间戳。 -
END_TIME
:表示执行完成时间的时间戳,无论 成功或失败。当作业当前未运行时,此列中的空值 表示存在某种类型的错误,并且框架无法执行 失败前的最后一次保存。 -
STATUS
:表示执行状态的字符串。这可能是 、 和其他。此列的对象表示形式是枚举。COMPLETED
STARTED
BatchStatus
-
EXIT_CODE
:表示执行的退出代码的字符串。在这种情况下 中,这可以转换为数字。 -
EXIT_MESSAGE
:字符串,表示 作业已退出。在失败的情况下,这可能包括尽可能多的堆栈跟踪 可能。 -
LAST_UPDATED
:表示上次保留此执行的时间戳。
桌子BATCH_STEP_EXECUTION
该表包含与对象相关的所有信息。此表在许多方面与表相似,并且
对于每个创建的条目,始终至少有一个条目。以下内容
清单显示了 table 的定义:BATCH_STEP_EXECUTION
StepExecution
BATCH_JOB_EXECUTION
Step
JobExecution
BATCH_STEP_EXECUTION
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)
) ;
以下列表描述了每一列:
-
STEP_EXECUTION_ID
:唯一标识此执行的主键。的值 此列应该可以通过调用 Object 的方法获得。getId
StepExecution
-
VERSION
:请参阅版本。 -
STEP_NAME
:此执行所属的步骤的名称。 -
JOB_EXECUTION_ID
:表中的外键。它指示 this 所属的 。对于给定名称,可能只有一个 for given 。BATCH_JOB_EXECUTION
JobExecution
StepExecution
StepExecution
JobExecution
Step
-
START_TIME
:表示执行开始时间的时间戳。 -
END_TIME
:表示执行完成时间的时间戳,无论 成功或失败。此列中的空值,即使作业不是 currently running,表示存在某种类型的错误,并且框架 无法在失败之前执行最后一次保存。 -
STATUS
:表示执行状态的字符串。这可能是 、 和其他。此列的对象表示形式是枚举。COMPLETED
STARTED
BatchStatus
-
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 可以 “从上次中断的地方开始”。以下内容
清单显示了 table 的定义: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
该表包含与 .正好有一个 per ,它包含所有数据
需要为特定步骤执行保留。此数据通常表示
状态,以便在失败后必须检索,以便 A 可以“启动
它停止的地方”。下面的清单显示了 table 的定义: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
:整个上下文,序列化。
归档
由于每次运行批处理作业时,多个表中都有条目,因此这种情况很常见 为元数据表创建存档策略。桌子本身是设计 显示过去发生的事情的记录,并且通常不会影响任何 Job 的 Job,但有一些与 restart 相关的显著例外:
-
该框架使用元数据表来确定之前是否运行过特定内容。如果已运行且作业不可重启,则 异常。
JobInstance
-
如果 a 的条目在未成功完成的情况下被删除,则 框架认为作业是新的,而不是重新启动的。
JobInstance
-
如果重新启动作业,框架将使用已保存到 的任何数据来恢复状态。因此,从 此表适用于未成功完成的作业,可防止它们从 如果它们再次运行,则为正确的点。
ExecutionContext
Job’s
为元数据表编制索引的建议
Spring Batch 为核心 jar 文件中的元数据表提供了 DDL 示例。
几个常见的数据库平台。索引声明不包含在该 DDL 中,
因为用户可能希望的索引方式有太多变化,具体取决于他们的
精确的平台、当地惯例以及 Job 的业务需求
操作。下表提供了一些指示,说明哪些列将要
在 Spring Batch 提供的 DAO 实现的子句中使用,以及如何
它们经常被使用,以便各个项目可以自己决定
关于索引:WHERE
默认表名称 |
Where 子句 |
频率 |
|
|
每次启动作业时 |
|
|
每次重启作业时 |
|
|
在提交间隔上,又名 chunk(以及 步骤) |
|
|
在每个步骤执行之前 |