Spring batch的運行過程中會將任務狀態記錄到框架預設的表中,表名有:
- batch_job_execution
- batch_job_execution_context
- batch_job_execution_params
- batch_job_execution_seq
- batch_job_instance
- batch_job_seq
- batch_step_execution
- batch_step_execution_context
- batch_step_execution_seq
創建語句如下:
CREATE TABLE `batch_job_execution` (
`JOB_EXECUTION_ID` BIGINT (20) NOT NULL,
`VERSION` BIGINT (20) DEFAULT NULL,
`JOB_INSTANCE_ID` BIGINT (20) NOT NULL,
`CREATE_TIME` datetime NOT NULL,
`START_TIME` datetime DEFAULT NULL,
`END_TIME` datetime DEFAULT NULL,
`STATUS` VARCHAR (10) DEFAULT NULL,
`EXIT_CODE` VARCHAR (2500) DEFAULT NULL,
`EXIT_MESSAGE` VARCHAR (2500) DEFAULT NULL,
`LAST_UPDATED` datetime DEFAULT NULL,
`JOB_CONFIGURATION_LOCATION` VARCHAR (2500) DEFAULT NULL,
PRIMARY KEY (`JOB_EXECUTION_ID`),
KEY `JOB_INST_EXEC_FK` (`JOB_INSTANCE_ID`),
CONSTRAINT `JOB_INST_EXEC_FK` FOREIGN KEY (`JOB_INSTANCE_ID`) REFERENCES `batch_job_instance` (`JOB_INSTANCE_ID`)
) ENGINE = INNODB DEFAULT CHARSET = utf8;
CREATE TABLE `batch_job_execution_context` (
`JOB_EXECUTION_ID` BIGINT (20) NOT NULL,
`SHORT_CONTEXT` VARCHAR (2500) NOT NULL,
`SERIALIZED_CONTEXT` text,
PRIMARY KEY (`JOB_EXECUTION_ID`),
CONSTRAINT `JOB_EXEC_CTX_FK` FOREIGN KEY (`JOB_EXECUTION_ID`) REFERENCES `batch_job_execution` (`JOB_EXECUTION_ID`)
) ENGINE = INNODB DEFAULT CHARSET = utf8;
CREATE TABLE `batch_job_execution_params` (
`JOB_EXECUTION_ID` BIGINT (20) NOT NULL,
`TYPE_CD` VARCHAR (6) NOT NULL,
`KEY_NAME` VARCHAR (100) NOT NULL,
`STRING_VAL` VARCHAR (250) DEFAULT NULL,
`DATE_VAL` datetime DEFAULT NULL,
`LONG_VAL` BIGINT (20) DEFAULT NULL,
`DOUBLE_VAL` DOUBLE DEFAULT NULL,
`IDENTIFYING` CHAR (1) NOT NULL,
KEY `JOB_EXEC_PARAMS_FK` (`JOB_EXECUTION_ID`),
CONSTRAINT `JOB_EXEC_PARAMS_FK` FOREIGN KEY (`JOB_EXECUTION_ID`) REFERENCES `batch_job_execution` (`JOB_EXECUTION_ID`)
) ENGINE = INNODB DEFAULT CHARSET = utf8;
CREATE TABLE `batch_job_execution_seq` (
`ID` BIGINT (20) NOT NULL,
`UNIQUE_KEY` CHAR (1) NOT NULL,
UNIQUE KEY `UNIQUE_KEY_UN` (`UNIQUE_KEY`)
) ENGINE = INNODB DEFAULT CHARSET = utf8;
CREATE TABLE `batch_job_instance` (
`JOB_INSTANCE_ID` BIGINT (20) NOT NULL,
`VERSION` BIGINT (20) DEFAULT NULL,
`JOB_NAME` VARCHAR (100) NOT NULL,
`JOB_KEY` VARCHAR (32) NOT NULL,
PRIMARY KEY (`JOB_INSTANCE_ID`),
UNIQUE KEY `JOB_INST_UN` (`JOB_NAME`, `JOB_KEY`)
) ENGINE = INNODB DEFAULT CHARSET = utf8;
CREATE TABLE `batch_job_seq` (
`ID` BIGINT (20) NOT NULL,
`UNIQUE_KEY` CHAR (1) NOT NULL,
UNIQUE KEY `UNIQUE_KEY_UN` (`UNIQUE_KEY`)
) ENGINE = INNODB DEFAULT CHARSET = utf8;
CREATE TABLE `batch_step_execution` (
`STEP_EXECUTION_ID` BIGINT (20) NOT NULL,
`VERSION` BIGINT (20) NOT NULL,
`STEP_NAME` VARCHAR (100) NOT NULL,
`JOB_EXECUTION_ID` BIGINT (20) NOT NULL,
`START_TIME` datetime NOT NULL,
`END_TIME` datetime DEFAULT NULL,
`STATUS` VARCHAR (10) DEFAULT NULL,
`COMMIT_COUNT` BIGINT (20) DEFAULT NULL,
`READ_COUNT` BIGINT (20) DEFAULT NULL,
`FILTER_COUNT` BIGINT (20) DEFAULT NULL,
`WRITE_COUNT` BIGINT (20) DEFAULT NULL,
`READ_SKIP_COUNT` BIGINT (20) DEFAULT NULL,
`WRITE_SKIP_COUNT` BIGINT (20) DEFAULT NULL,
`PROCESS_SKIP_COUNT` BIGINT (20) DEFAULT NULL,
`ROLLBACK_COUNT` BIGINT (20) DEFAULT NULL,
`EXIT_CODE` VARCHAR (2500) DEFAULT NULL,
`EXIT_MESSAGE` VARCHAR (2500) DEFAULT NULL,
`LAST_UPDATED` datetime DEFAULT NULL,
PRIMARY KEY (`STEP_EXECUTION_ID`),
KEY `JOB_EXEC_STEP_FK` (`JOB_EXECUTION_ID`),
CONSTRAINT `JOB_EXEC_STEP_FK` FOREIGN KEY (`JOB_EXECUTION_ID`) REFERENCES `batch_job_execution` (`JOB_EXECUTION_ID`)
) ENGINE = INNODB DEFAULT CHARSET = utf8;
CREATE TABLE `batch_step_execution_context` (
`STEP_EXECUTION_ID` BIGINT (20) NOT NULL,
`SHORT_CONTEXT` VARCHAR (2500) NOT NULL,
`SERIALIZED_CONTEXT` text,
PRIMARY KEY (`STEP_EXECUTION_ID`),
CONSTRAINT `STEP_EXEC_CTX_FK` FOREIGN KEY (`STEP_EXECUTION_ID`) REFERENCES `batch_step_execution` (`STEP_EXECUTION_ID`)
) ENGINE = INNODB DEFAULT CHARSET = utf8;
CREATE TABLE `batch_step_execution_seq` (
`ID` BIGINT (20) NOT NULL,
`UNIQUE_KEY` CHAR (1) NOT NULL,
UNIQUE KEY `UNIQUE_KEY_UN` (`UNIQUE_KEY`)
) ENGINE = INNODB DEFAULT CHARSET = utf8;
創建完表之後,運行程序,會發現,第一次運行會正常,第二次則會報出類似錯誤:
2018-12-21 09:16:09.027 ERROR 20408 --- [nio-8080-exec-4] druid.sql.Statement : {conn-110001, pstmt-120005} execute error. INSERT into BATCH_JOB_INSTANCE(JOB_INSTANCE_ID, JOB_NAME, JOB_KEY, VERSION) values (?, ?, ?, ?)
com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Duplicate entry '0' for key 'PRIMARY'
這是源數據表未做初始化導致的,初始化語句如下:
INSERT INTO BATCH_STEP_EXECUTION_SEQ (ID, UNIQUE_KEY) SELECT
*
FROM
(
SELECT
0 AS ID,
'0' AS UNIQUE_KEY
) AS tmp
WHERE
NOT EXISTS (
SELECT
*
FROM
BATCH_STEP_EXECUTION_SEQ
);
INSERT INTO BATCH_JOB_EXECUTION_SEQ (ID, UNIQUE_KEY) SELECT
*
FROM
(
SELECT
0 AS ID,
'0' AS UNIQUE_KEY
) AS tmp
WHERE
NOT EXISTS (
SELECT
*
FROM
BATCH_JOB_EXECUTION_SEQ
);
INSERT INTO BATCH_JOB_SEQ (ID, UNIQUE_KEY) SELECT
*
FROM
(
SELECT
0 AS ID,
'0' AS UNIQUE_KEY
) AS tmp
WHERE
NOT EXISTS (SELECT * FROM BATCH_JOB_SEQ);
再運行程序,發現一切OK了!