From 6805ce4b0e2d34e5c8fc719322e7156213a1d86b Mon Sep 17 00:00:00 2001 From: lucasward Date: Fri, 2 May 2008 23:12:32 +0000 Subject: [PATCH] BATCH-605:Added an extra section about archiving and some misc. changes from review with Wayne. --- .../docbook/reference/schema-appendix.xml | 93 ++++++++++++------ .../reference/images/meta-data-erd.png | Bin 0 -> 37584 bytes 2 files changed, 62 insertions(+), 31 deletions(-) create mode 100755 docs/src/site/resources/reference/images/meta-data-erd.png diff --git a/docs/src/site/docbook/reference/schema-appendix.xml b/docs/src/site/docbook/reference/schema-appendix.xml index 871a731d0..475a4cf60 100644 --- a/docs/src/site/docbook/reference/schema-appendix.xml +++ b/docs/src/site/docbook/reference/schema-appendix.xml @@ -1,6 +1,6 @@ - + Meta-Data Schema @@ -13,25 +13,29 @@ BATCH_JOB_INSTANCE, BATCH_JOB_EXECUTION, BATCH_JOB_PARAMS, BATCH_STEP_EXECUTION, BATCH_STEP_EXECUTION_CONTEXT, respectively. The JobRepository is responsible for saving and storing - each of java object into it's correct table. The following appendix - describes the meta-data tables in detail, along with many of the design - decisions that were made when creating them. When viewing the various - table creation statements below, it is important to realize that the - datatypes used are as generic as possible. Spring Batch provides many - schemas as examples, which all have varying datatypes due to quirks in - individual database vendors' handling of data types. Below is an ERD model - of all 5 tables and their relationships to one another: + each Java object into it's correct table. The following appendix describes + the meta-data tables in detail, along with many of the design decisions + that were made when creating them. When viewing the various table creation + statements below, it is important to realize that the data types used are + as generic as possible. Spring Batch provides many schemas as examples, + which all have varying data types due to variations in individual database + vendors' handling of data types. Below is an ERD model of all 5 tables and + their relationships to one another: - - + + + + + +
Version - Many of the databse tables discussed in this appendix contain a + Many of the database tables discussed in this appendix contain a version column. This column is important because Spring Batch employs an optimistic locking strategy when dealing with updates to the database. This means that each time a record is 'touched' (updated) the value in @@ -39,7 +43,7 @@ to try and save the value, if the version number has change it will throw OptimisticLockingFailureException, indicating there has been an error with concurrent access. This check is - very necessary, since even though different batch jobs may be running in + necessary, since even though different batch jobs may be running in different machines, they are all using the same database tables.
@@ -51,7 +55,7 @@ respective tables. However, they are not database generated keys, but rather are generated by separate sequences. This is necessary because after inserting one of the domain objects into the database, the key it - is given need to be set on the actual object, so that they can be + is given needs to be set on the actual object, so that they can be uniquely identified in Java. Newer database drivers (Jdbc 3.0 and up) support this feature with database generated keys, but rather than requiring it, sequences were used. Each variation of the schema will @@ -61,8 +65,8 @@ CREATE SEQUENCE BATCH_JOB_EXECUTION_SEQ; CREATE SEQUENCE BATCH_JOB_SEQ; - Many database vendors don't official support sequences. In these - cases, work arounds are used, such as the following for mySQL: + Many database vendors don't support sequences. In these cases, + work arounds are used, such as the following for mySQL: CREATE TABLE BATCH_STEP_EXECUTION_SEQ (ID BIGINT NOT NULL) type=MYISAM; INSERT INTO BATCH_STEP_EXECUTION_SEQ values(0); @@ -73,7 +77,7 @@ INSERT INTO BATCH_JOB_SEQ values(0); In the above case, a table is used in place of each sequence. The Spring core class MySQLMaxValueIncrementer will - then increment hte one column in this sequence in order to give similar + then increment the one column in this sequence in order to give similar functionality. @@ -83,7 +87,7 @@ INSERT INTO BATCH_JOB_SEQ values(0); The BATCH_JOB_INSTANCE table holds all information relevant to a JobInstance, and serves as the top of the overall - heirarchy. The following generic DDL statement is used to create + hierarchy. The following generic DDL statement is used to create it: CREATE TABLE BATCH_JOB_INSTANCE ( @@ -156,12 +160,12 @@ INSERT INTO BATCH_JOB_SEQ values(0); TYPE_CD: String representation of the type of value stored, - which can be either a character string, date, long, or double. Because - the type must be known, it cannot be null. + which can be either a string, date, long, or double. Because the type + must be known, it cannot be null. - KEY_NAME: The Parameter key. + KEY_NAME: The parameter key. @@ -177,7 +181,7 @@ INSERT INTO BATCH_JOB_SEQ values(0); - DOUBLE_VAL: Paramter value, if the type is double. + DOUBLE_VAL: Parameter value, if the type is double. @@ -214,8 +218,8 @@ INSERT INTO BATCH_JOB_SEQ values(0); JOB_EXECUTION_ID: Primary key that uniquely identifies this - execution. The value of this column should be obtainable by calling - the getId method of the + execution. The value of this column is obtainable by calling the + getId method of the JobExecution object. @@ -347,7 +351,7 @@ INSERT INTO BATCH_JOB_SEQ values(0); - ITEM_COUNT: The number of items that have been writtne out + ITEM_COUNT: The number of items that have been written out during this execution. @@ -378,10 +382,10 @@ INSERT INTO BATCH_JOB_SEQ values(0); one ExecutionContext per StepExecution, and it contains all user defined key/value pairs that need to persisted for a particular job run. This data - is usually state information that must be retrieved back after a failure - so that a JobInstance can 'start from where it left off'. As with the - BATCH_JOB_PARAMS table, this table has been denormalized and uses a column - to determine the type: + is typically state that must be retrieved back after a failure so that a + JobInstance can 'start from where it left off'. As + with the BATCH_JOB_PARAMS table, this table has been denormalized and uses + a column to determine the type: CREATE TABLE BATCH_STEP_EXECUTION_CONTEXT ( STEP_EXECUTION_ID BIGINT NOT NULL , @@ -429,7 +433,7 @@ INSERT INTO BATCH_JOB_SEQ values(0); - DOUBLE_VAL: Paramter value, if the type is double. + DOUBLE_VAL: Parameter value, if the type is double. @@ -445,4 +449,31 @@ INSERT INTO BATCH_JOB_SEQ values(0); it. If a user so chooses, one may be added with a database generated key, without causing any issues to the framework itself. + +
+ Archiving + + Because there are entries in multiple tables everytime a batch job + is run, it is common to create an archive strategy for the meta-data + tables. The tables themselves are designed to show a record of what + happened in the past, and generally won't affect the run of any job, with + a couple of notable exceptions: + + + + Restart: Because the ExecutionContext is persisted, removing any + entries from this table of jobs that haven't completed successfully, + will prevent them from starting at the correct point if run again. + Furthermore, if an entry for a JobInstance is removed without having + completed successfully, the framework will think that the job is new, + rather than a restart. + + + + Determining if an instance has been run: The framework will use + the meta-data tables to determine if a particular JobInstance has been + run before, and if it has an exception will be thrown. + + +
\ No newline at end of file diff --git a/docs/src/site/resources/reference/images/meta-data-erd.png b/docs/src/site/resources/reference/images/meta-data-erd.png new file mode 100755 index 0000000000000000000000000000000000000000..2a7179068bac5ad0ca85fe82be3b0c9b440c765b GIT binary patch literal 37584 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 literal 0 HcmV?d00001