元数据模式
概述
Spring Batch 元数据表与代表它们的域对象非常匹配
Java。例如JobInstance,作业执行,作业参数和步执行映射到BATCH_JOB_INSTANCE,BATCH_JOB_EXECUTION,BATCH_JOB_EXECUTION_PARAMS和BATCH_STEP_EXECUTION分别。执行上下文两者的映射BATCH_JOB_EXECUTION_CONTEXT和BATCH_STEP_EXECUTION_CONTEXT.这JobRepository是
负责将每个 Java 对象保存并存储到其正确的表中。本附录
详细描述了元数据表,以及许多设计决策
在制作它们时就已经被制造出来了。在查看描述的各种表格创建语句时
在本附录后面请注意,所用的数据类型尽可能通用。Spring
批处理提供了许多模式示例。它们的数据类型各不相同,原因包括
各数据库厂商处理数据类型的差异。下图
展示了六个表及其相互关系的ERD模型:
DDL 脚本示例
Spring Batch Core JAR文件包含创建关系表的示例脚本
对于多个数据库平台(这些平台又被作业自动检测)
仓库工厂豆或等价命名空间)。这些文字可以直接使用,或者
根据需要添加额外的索引和约束。文件名在
形式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
版本
本附录中讨论的许多数据库表都包含版本列。这
列很重要,因为春批采用了乐观锁定策略,当
处理数据库更新。这意味着每次“触摸记录”时
(更新),版本列中的值会递增一。当仓库消失时
为了保存值,如果版本号变了,它会抛出OptimisticLockingFailureException,表明存在并发错误
访问。这种检查是必要的,因为即使不同的批处理作业可能在运行
在不同的机器中,它们都使用相同的数据库表。
身份
BATCH_JOB_INSTANCE,BATCH_JOB_EXECUTION和BATCH_STEP_EXECUTION每个包含
列以_ID.这些字段作为各自表的主键。
然而,它们并不是数据库生成的密钥。相反,它们是由独立生成的
序列。这是必要的,因为在将其中一个域对象插入到
database,它所获得的键需要在实际对象上设置,这样它们才能
在爪哇中唯一标识。较新的数据库驱动(JDBC 3.0及以上版本)支持此功能
带有数据库生成密钥的功能。不过,与其要求这个功能,
使用序列。每种模式变体都包含以下某种形式
语句:
CREATE SEQUENCE BATCH_STEP_EXECUTION_SEQ;
CREATE SEQUENCE BATCH_JOB_EXECUTION_SEQ;
CREATE SEQUENCE BATCH_JOB_INSTANCE_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_INSTANCE_SEQ (ID BIGINT NOT NULL) type=InnoDB;
INSERT INTO BATCH_JOB_INSTANCE_SEQ values(0);
在前述情况下,每个序列使用一个表代替。春季核心课程,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. -
版本:见版本。 -
JOB_NAME: 从中获得的职位名称工作对象。因为这是必须的 识别实例,不能是空的。 -
JOB_KEY:序列化作业参数唯一标识分离的 同一任务的实例相互引用。(JobInstances必须使用相同的职位名称 有不同的作业参数因此,也不同JOB_KEY价值观)。
这BATCH_JOB_EXECUTION_PARAMS桌子
这BATCH_JOB_EXECUTION_PARAMS表格包含所有与作业参数对象。它包含0对或更多键值对传递给工作和
作为运行作业参数的记录。对于每个参数
对工作身份的生成有贡献,识别标记设置为 true。
注意,该表已被非归一化。而不是为每个人单独创建一个表格
有一个表,带有一列表示类型,如下
列表节目:
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桌子
这BATCH_JOB_EXECUTION表格包含所有与作业执行对象。每一次工作运行时,总会有新的 被调用作业执行以及新的一行
这张桌子。以下列表展示了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(获取识别)方法作业执行对象。 -
版本:见版本。 -
JOB_INSTANCE_ID:来自BATCH_JOB_INSTANCE桌子。它表示 该处决所属的实例。每个执行可能会有多个执行 实例。 -
CREATE_TIME:时间戳表示执行创建的时间。 -
START_TIME:时间戳表示执行开始的时间。 -
END_TIME: 表示执行结束的时间戳,无论 成功或失败。当作业当前未运行时,该列为空值 表示存在某种错误,框架无法运行 失败前的最后一次存档。 -
地位: 表示执行状态的字符串。这可能是完成,开始,以及其他。该列的对象表示为批处理状态列举。 -
EXIT_CODE: 表示执行出口代码的字符字符串。在 命令行作业中,这可以转换为数字。 -
EXIT_MESSAGE:字符字符串表示更详细的描述 工作退出。在故障的情况下,这可能包括与栈跟踪一样多的部分 可能。 -
LAST_UPDATED: 时间戳表示该执行最后一次被持久化的时间。
这BATCH_STEP_EXECUTION桌子
这BATCH_STEP_EXECUTION表格包含所有与步执行对象。该表在许多方面与BATCH_JOB_EXECUTION桌子,在那里
总是至少每个 有一次步每个作业执行创建。如下
列表展示了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(获取识别)方法步执行对象。 -
版本:见版本。 -
STEP_NAME:该执行所属步骤的名称。 -
JOB_EXECUTION_ID:来自BATCH_JOB_EXECUTION桌子。它表示作业执行对此步执行是。可能只有一个步执行对于给定的作业执行对于给定的步名字。 -
START_TIME:时间戳表示执行开始的时间。 -
END_TIME: 表示执行完成的时间点,无论如何 成功或失败。该列中出现空值,尽管作业本身并非空值 当前运行,表明存在某种错误,框架本身 无法在失败前进行最后一次存档。 -
地位: 表示执行状态的字符串。这可能是完成,开始,以及其他。该列的对象表示为批处理状态列举。 -
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表格包含所有与执行上下文一工作.正好有一个工作 执行上下文每个作业执行它包含了某一特定所需的所有作业级数据
任务执行。这些数据通常代表在
失败,因此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:表示作业执行背景 是。同一执行可能关联多个行。 -
SHORT_CONTEXT:字符串版本SERIALIZED_CONTEXT. -
SERIALIZED_CONTEXT:完整的语境,连载。
这BATCH_STEP_EXECUTION_CONTEXT桌子
这BATCH_STEP_EXECUTION_CONTEXT表格包含所有与执行上下文一步.正好有一个执行上下文每步执行,且包含所有
需要在特定步骤执行时持久化。这些数据通常代表
必须在失败后恢复状态,使得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:表示步执行背景 是。同一执行可能关联多个行。 -
SHORT_CONTEXT:字符串版本SERIALIZED_CONTEXT. -
SERIALIZED_CONTEXT:完整的语境,连载。
归档
由于每次运行批处理作业时,多个表中都有条目,因此很常见 为元数据表制定归档策略。桌子本身是经过设计的 展示过去发生的事情记录,通常不影响任何项目的运行 工作,除了与重启相关的几个显著例外:
-
该框架利用元数据表来判断某一特定
JobInstance此前已有人主持。如果任务已经运行且作业不可重启,则 例外被提出。 -
如果是
JobInstance在未成功完成的情况下被移除, 框架认为这份工作是新的,而不是重新开始。 -
如果作业被重启,框架会使用所有已持久化到该项目的数据
执行上下文以恢复乔布的州。因此,移除了 此表显示未成功完成的任务阻止它们从以下 如果再次运行,正确的点。
国际字符和多字节字符
如果你在业务中使用多字节字符集(比如中文或西里尔字母)
处理中,这些字符可能需要在 Spring Batch 架构中持久化。
许多用户发现,只需将模式长度加倍即可瓦尔查尔列数就足够了。另一些人则更倾向于配置作业仓库最大变长一半
的值瓦尔查尔列长。一些用户还报告他们使用NVARCHAR代替瓦尔查尔在他们的模式定义中。最佳结果取决于
数据库平台以及数据库服务器的本地配置方式。
关于元数据表索引的建议
Spring Batch 为核心jar文件中的元数据表提供了DDL样本
有几个常见的数据库平台。该DDL中不包含索引声明,
因为用户想要索引的方式有太多变化,取决于他们的
具体平台、本地大会以及工作内容的商业需求
操作。下表提供了哪些列将
被用于哪里Spring Batch提供的DAO实现及其相关方式
它们通常被用来让各个项目自行做出决定
关于索引:
默认表名称 |
其中条款 |
频率 |
|
|
每次有工作上线 |
|
|
每次重启作业 |
|
|
在提交间隔,也称为块(以及在 的开始和结束处) 步进) |
|
|
在每一步执行之前 |