元数据架构
概述
Spring Batch 元数据表与表示它们的域对象紧密匹配
Java。例如JobInstance,JobExecution,JobParameters和StepExecutionmap 到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 提供了许多 schema 作为示例。它们都具有不同的数据类型,因为
各个数据库供应商处理数据类型的方式各不相同。下图
显示了所有六个表的 ERD 模型及其彼此之间的关系:
DDL 脚本示例
Spring Batch Core JAR 文件包含用于创建关系表的示例脚本
对于许多数据库平台(反过来,这些平台由 Job 自动检测
repository factory 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
版本
本附录中讨论的许多数据库 table 都包含 version 列。这
列很重要,因为 Spring Batch 在
处理数据库的更新。这意味着每次 “touched” 记录时
(updated) 时,version 列中的值将递增 1。当仓库
back 来保存值,如果版本号已经改变,它会抛出一个OptimisticLockingFailureException,指示 concurrent 存在错误
访问。此检查是必要的,因为即使可能正在运行不同的批处理作业
在不同的机器中,它们都使用相同的数据库表。
身份
BATCH_JOB_INSTANCE,BATCH_JOB_EXECUTION和BATCH_STEP_EXECUTION每个包含
以_ID.这些字段充当其各自表的主键。
但是,它们不是数据库生成的键。相反,它们是由单独的
序列。这是必要的,因为在将其中一个域对象插入
database 中,需要对实际对象设置给定的 key,以便它们可以
在 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_INSTANCEtable 包含与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。它也是主要的 钥匙。此列的值应可通过调用getIdmethod 开启JobInstance. -
VERSION:请参阅版本。 -
JOB_NAME:从Job对象。因为它需要 标识实例,则它不能为 null。 -
JOB_KEY:的序列化JobParameters,唯一标识单独的 同一作业的实例。(JobInstances具有相同的作业名称 具有不同的JobParameters因此,不同JOB_KEY值)。
这BATCH_JOB_EXECUTION_PARAMS桌子
这BATCH_JOB_EXECUTION_PARAMStable 包含与JobParameters对象。它包含传递给Job和
用作运行作业时使用的参数的记录。对于每个参数
有助于生成作业的身份,则IDENTIFYINGflag 设置为 true。
请注意,该表已非规范化。而不是为每个
type 中,有一个表,其中有一列指示类型,如下所示
列表显示:
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表,该表指示 参数条目所属的任务执行。请注意,多行(即 键/值对)的 Alpha 值对)。 -
PARAMETER_NAME:参数名称。
-
PARAMETER_TYPE:参数类型的完全限定名称。
-
PARAMETER_VALUE:参数值
-
IDENTIFYING:指示参数是否有助于 相关
JobInstance.
请注意,此表没有主键。这是因为框架没有 用于 1,因此不需要它。如果需要,您可以添加主键 使用数据库生成的密钥,而不会对框架本身造成任何问题。
这BATCH_JOB_EXECUTION桌子
这BATCH_JOB_EXECUTIONtable 包含与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:唯一标识此执行的主键。的值 此列可通过调用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_EXECUTIONtable 包含与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:唯一标识此执行的主键。的值 此列应可通过调用getId方法StepExecution对象。 -
VERSION:请参阅版本。 -
STEP_NAME:此执行所属的步骤的名称。 -
JOB_EXECUTION_ID:来自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桌子
这BATCH_JOB_EXECUTION_CONTEXTtable 包含与ExecutionContext的Job.正好有一个Job ExecutionContext对于每个JobExecution,它包含特定
任务执行。此数据通常表示必须在
failure,因此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:String 的SERIALIZED_CONTEXT. -
SERIALIZED_CONTEXT:整个上下文,序列化。
这BATCH_STEP_EXECUTION_CONTEXT桌子
这BATCH_STEP_EXECUTION_CONTEXTtable 包含与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:String 的SERIALIZED_CONTEXT. -
SERIALIZED_CONTEXT:整个上下文,序列化。
归档
由于每次运行批处理作业时,多个表中都有条目,因此这种情况很常见 为元数据表创建存档策略。桌子本身是设计 显示过去发生的事情的记录,并且通常不会影响任何 Job 的 Job,但有一些与 restart 相关的显著例外:
-
框架使用元数据表来确定特定的
JobInstance之前已经运行过。如果已运行且作业不可重启,则 异常。 -
如果
JobInstance在未成功完成的情况下被删除,则 框架认为作业是新的,而不是重新启动的。 -
如果重新启动作业,框架将使用已持久化到
ExecutionContext要恢复Job’s州。因此,从 此表适用于未成功完成的作业,可防止它们从 如果它们再次运行,则为正确的点。
国际字符和多字节字符
如果您在企业中使用多字节字符集(例如中文或西里尔文)
处理时,这些字符可能需要保留在 Spring Batch 架构中。
许多用户发现,只需将 schema 更改为VARCHARcolumns 就足够了。其他人更喜欢使用max-varchar-length一半
的值VARCHARcolumn length 的一些用户还报告说,他们使用NVARCHAR代替VARCHAR在其 schema 定义中。最佳结果取决于
数据库平台和数据库服务器在本地配置的方式。
为元数据表编制索引的建议
Spring Batch 为核心 jar 文件中的元数据表提供了 DDL 示例。
几个常见的数据库平台。索引声明不包含在该 DDL 中,
因为用户可能希望的索引方式有太多变化,具体取决于他们的
精确的平台、当地惯例以及 Job 的业务需求
操作。下表提供了一些指示,说明哪些列将要
用于WHERE由 Spring Batch 提供的 DAO 实现的子句以及
它们经常被使用,以便各个项目可以自己决定
关于索引:
默认表名称 |
Where 子句 |
频率 |
|
|
每次启动作业时 |
|
|
每次重启作业时 |
|
|
在提交间隔上,又名 chunk(以及 步骤) |
|
|
在每个步骤执行之前 |