元数据架构
附录 A:元数据架构
概述
Spring Batch Metadata 表与在
Java。例如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
是
负责将每个 Java 对象保存并存储到其正确的表中。本附录
详细描述了元数据表,以及许多设计决策
是在创建它们时制作的。查看下面的各种表创建语句时,
重要的是要认识到所使用的数据类型尽可能通用。Spring
Batch 提供了许多架构作为示例,所有这些架构都具有不同的数据类型,因为
各个数据库提供商处理数据类型的方式的变化。下图
显示了所有 6 个表及其相互关系的 ERD 模型:

DDL 脚本示例
Spring Batch Core JAR 文件包含用于创建关系表的示例脚本
对于许多数据库平台(这些平台又由作业自动检测到
存储库工厂 bean 或命名空间等效项)。这些脚本可以按原样使用,或者
根据需要使用其他索引和约束进行修改。文件名位于
形式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
版本
本附录中讨论的许多数据库表都包含版本列。这
列很重要,因为 Spring Batch 在
处理数据库的更新。这意味着每次“触摸”记录时
(已更新)版本列中的值递增 1。当存储库离开时
返回以保存值,如果版本号已更改,则会抛出OptimisticLockingFailureException
,表示并发
访问。此检查是必要的,因为即使可能正在运行不同的批处理作业
在不同的机器上,它们都使用相同的数据库表。
身份
BATCH_JOB_INSTANCE
,BATCH_JOB_EXECUTION
和BATCH_STEP_EXECUTION
每个包含
以_ID
.这些字段充当各自表的主键。
但是,它们不是数据库生成的密钥。相反,它们是由单独的
序列。这是必要的,因为在将其中一个域对象插入到
数据库,需要在实际对象上设置给定的键,以便它们可以
在 Java 中唯一标识。较新的数据库驱动程序(JDBC 3.0 及更高版本)支持此功能
具有数据库生成键的功能。但是,与其要求该功能,
序列。架构的每个变体都包含以下某种形式
语句:
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
这BATCH_JOB_INSTANCE
表包含与JobInstance
和
作为整体层次结构的顶端。使用以下通用 DDL 语句
要创建它:
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。它也是主要的 钥匙。此列的值应该可以通过调用getId
方法JobInstance
. -
VERSION
:请参阅版本。 -
JOB_NAME
:从Job
对象。因为它需要 标识实例,它不得为 null。 -
JOB_KEY
:序列化JobParameters
唯一标识单独的 同一作业的实例。(JobInstances
必须具有相同作业名称 有不同的JobParameters
因此,不同JOB_KEY
值)。
BATCH_JOB_EXECUTION_PARAMS
这BATCH_JOB_EXECUTION_PARAMS
表包含与JobParameters
对象。它包含 0 个或多个传递给Job
和
用作运行作业时使用的参数的记录。对于每个参数,该
有助于生成作业的标识,IDENTIFYING
标志设置为 true。
请注意,该表已非规范化。而不是为每个
type 时,有一个表有一个列指示类型,如下所示
清单:
CREATE TABLE BATCH_JOB_EXECUTION_PARAMS (
JOB_EXECUTION_ID BIGINT NOT NULL ,
TYPE_CD VARCHAR(6) NOT NULL ,
KEY_NAME VARCHAR(100) NOT NULL ,
STRING_VAL VARCHAR(250) ,
DATE_VAL DATETIME DEFAULT NULL ,
LONG_VAL BIGINT ,
DOUBLE_VAL DOUBLE PRECISION ,
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
表,指示 参数条目所属的作业执行。请注意,多行(即 键/值对)可能存在。 -
TYPE_CD:存储的值类型的字符串表示,可以是字符串,可以是字符串,也可以是 日期、长或双。因为类型必须是已知的,所以它不能是空。
-
KEY_NAME:参数键。
-
STRING_VAL:参数值,如果类型为字符串。
-
DATE_VAL:参数值,如果类型为日期。
-
LONG_VAL:参数值,如果类型为长。
-
DOUBLE_VAL:参数值,如果类型为 double。
-
IDENTIFYING:指示参数是否有助于 相关
JobInstance
.
请注意,此表没有主键。这是因为框架没有 用于一个,因此不需要它。如果需要,您可以添加一个主键 添加数据库生成的密钥,而不会对框架本身造成任何问题。
BATCH_JOB_EXECUTION
这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,
JOB_CONFIGURATION_LOCATION VARCHAR(2500) NULL,
constraint JOB_INSTANCE_EXECUTION_FK foreign key (JOB_INSTANCE_ID)
references BATCH_JOB_INSTANCE(JOB_INSTANCE_ID)
) ;
以下列表描述了每列:
-
JOB_EXECUTION_ID
:唯一标识此执行的主键。的值 可以通过调用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
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
:唯一标识此执行的主键。的值 该列应通过调用getId
方法StepExecution
对象。 -
VERSION
:请参阅版本。 -
STEP_NAME
:此执行所属的步骤的名称。 -
JOB_EXECUTION_ID
:来自BATCH_JOB_EXECUTION
桌子。它表示JobExecution
这StepExecution
是。可能只有一个StepExecution
给定JobExecution
给定Step
名字。 -
START_TIME
:表示执行开始时间的时间戳。 -
END_TIME
:表示执行完成时间的时间戳,无论 成功或失败。此列中的空值,即使作业不是 当前正在运行,表示存在某种类型的错误,并且框架是 无法在失败之前执行最后一次保存。 -
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
这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
在未成功完成的情况下被删除,则 框架认为工作是新的,而不是重新开始的。 -
如果重新启动作业,框架将使用已持久化到
ExecutionContext
要恢复Job’s
州。因此,从 此表表示尚未成功完成的作业可防止它们从 如果再次运行,则正确的点。
国际字符和多字节字符
如果您在业务中使用多字节字符集(例如中文或西里尔字母)
processing,则这些字符可能需要保留在 Spring Batch 模式中。
许多用户发现,只需更改模式即可将VARCHAR
列就足够了。其他人更喜欢使用max-varchar-length
一半
的值VARCHAR
列长。一些用户还报告说,他们使用NVARCHAR
代替VARCHAR
在他们的模式定义中。最好的结果取决于
数据库平台以及数据库服务器在本地的配置方式。
有关索引元数据表的建议
Spring Batch 为核心 jar 文件中的元数据表提供 DDL 示例,用于
几个常见的数据库平台。索引声明不包含在该 DDL 中,
因为用户可能希望编制索引的方式有太多变化,具体取决于他们的
精确的平台、当地惯例以及工作方式的业务需求
操作。下面提供了一些关于哪些列将要
用于WHERE
Spring Batch 提供的 DAO 实现的子句以及如何
它们可能会经常被使用,以便各个项目可以自己做出决定
关于索引:
默认表名称 |
Where 子句 |
频率 |
BATCH_JOB_INSTANCE |
JOB_NAME = ?并且 JOB_KEY = ? |
每次启动作业时 |
BATCH_JOB_EXECUTION |
JOB_INSTANCE_ID = ? |
每次重新启动作业时 |
BATCH_STEP_EXECUTION |
版本 = ? |
在提交间隔上,又名块(以及 步骤) |
BATCH_STEP_EXECUTION |
STEP_NAME = ?并且 JOB_EXECUTION_ID = ? |
在执行每个步骤之前 |