5.4.6 バッチデータ
データ型OBMのバッチデータは,HiRDBのRDBをサポートします。テーブルおよびインデクス作成のサンプルSQLを提供します。作成手順,サンプルSQLは「26.3 バッチデータの作成」を参照してください。
- 〈この項の構成〉
(1) データ形式
1つのOBMにつき,1つのテーブルにバッチデータを作成します。
(a) テーブル
テーブル名は,定義によってOBM名(最上位ロット名)と1対1に関連づけます。
(b) 列
列は,キー,一連通番,データから成ります。
- キー列
-
キー列は,最大で3つの列を指定できます。ロットの階層数とキー列の数は,一致させる必要はありません。バッチデータの横分割が容易となるように考慮して指定することを推奨します。
キーには,バッチデータに対応する最下位ロットが一意に決まるように,最下位ロットごとにユニークな値を設定してください。キー列を複数指定する場合は,すべてのキー列を組み合わせてユニークな値としてください。
ロットが1階層の場合は,キー列は必要ありません。
- 一連通番の列
-
一連通番の列には,最下位ロットごとに1からの連番で採番します。抜けや重複があってはいけません。重複があると,インデクスで示すUNIQUE属性のINDEXの作成でINDEXが作成できないでSQLがエラーとなります。抜けがあると,OBMのノーマルトランザクション実行時に抜けを検知してOBMを強制停止します。抜けによるOBM強制停止後は,eeobmskipコマンドで抜けた通番をスキップしてから,eeobmstartコマンドでOBMを再開してください。
- データの列
-
データの列には,バッチ業務で使用する任意のデータを設定します。データは,設定した一連通番の昇順に入力して,ノーマルトランザクション起動時に1行ずつ渡します。そのため,処理をする順番に昇順で一連通番を採番してください。
- 最下位ロットごとのデータの終端
-
最下位ロットのデータは,トレーラレコードを終端として扱います。トレーラレコードよりも大きい通番を持つデータがあっても処理しません。トレーラレコードがない場合は,一連通番が最も大きいデータを終端として扱います。トレーラレコードをバッチデータとして,ノーマルトランザクション(およびサービス名決定UOC)を起動するかどうかを選択できます。
- ヘッダデータ
-
キー列が空白で,一連通番が0の列をヘッダデータとして扱います。
ヘッダデータは,開始UOC,終了UOCに引き渡します。開始UOCでは,ヘッダデータをチェックし,バッチ処理の起動条件などの任意のチェックができます。終了UOCでは,ヘッダデータを上書きできます。
- インデクス
-
データの入力は,キー列と一連通番の列をAND演算子を使用した複合条件検索で入力します。そのため,キー列と一連通番の列を主キーとしたインデクスを作成してください。またキーの重複を防ぐためにUNIQUE属性を設定してください。
- 表,インデクスの横分割
-
表とインデクスは,ロット構成とデータ量に応じて横分割することを推奨します。同時にバッチ処理を実行するロットのデータ入力によるHiRDBへのアクセスが集中しないように横分割することが望ましいです。横分割の詳細については,マニュアル「HiRDB Version 9 解説」を参照してください。
図5‒28 バッチデータ
(2) 非同期入力
(a) ノーマルトランザクションと並行して入力
OBMでは,データ入力処理とノーマルトランザクションの実行を並行して実行します。これによって,データ入力待ち時間を削減してバッチ処理全体の処理時間が向上します。
なお,バッチデータを入力するトランザクションのトランザクションレベルは,obmdef -k queオペランドの設定によって決まります。
(b) ブロック入力
バッチデータの入力は,HiRDBの配列を使用したFETCH機能を使用します。これによってBCMとHiRDBサーバ間の通信回数を削減し,通信によるオーバヘッドを軽減できます。
(3) バッチデータのスキップ
データ不正などによってバッチ処理が継続できない場合,eeobmskipコマンドを実行することで,ノーマルトランザクションを実行しないでバッチデータを処理済みとすることができます。これをデータのスキップと呼びます。スキップしたバッチデータは,スキップデータUOCに1件ずつ渡します。UOCでは,スキップしたバッチデータを参照して任意の処理ができます。
eeobmskipコマンドを実行したトランザクションがコミット決着した場合の動作は,スキップデータUOCを使用するかどうかで異なります。
スキップデータUOCを使用していない場合は,eeobmskipコマンドを実行したトランザクションがコミット決着した時点で,スキップしたバッチデータが処理済みとなります。
スキップデータUOCを使用する場合は,eeobmskipコマンドを実行したトランザクションがコミット決着後にeeobmstartを実行するとノーマルトランザクションを呼び出す替わりにスキップデータUOCが呼び出されます。
コミット決着をしなかった場合は,データのスキップは行われません。
eeobmskipコマンドによるデータのスキップは,障害停止状態のデータ型OBMに対して実行できます。
(4) 複数データの一括処理
データ型OBMでは,1回のノーマルトランザクションで複数のメッセージを処理できます。これによって,OBMによる処理済みデータ状態更新処理,および同期点処理を複数のメッセージで1回だけ行いHiRDBサーバとの通信を減らし,バッチ処理全体の実行時間を短縮できます。
ノーマルトランザクションからee_obm_recv/CBLEEOBM('RECV')を実行することで,複数データを一括処理できます。1回のノーマルトランザクションで一括処理できるデータ件数の上限は,OBM構成定義obmdefコマンド-bオプションで設定したレコード数となります。
複数データの一括処理でも,バッチデータを処理済みとする契機は,ノーマルトランザクションが正常終了した場合です。連鎖モードのcommitを実行しても処理済みとなりません。一括処理したバッチデータの一部だけが処理済みとなることはありません。一括処理したすべてのバッチデータが処理済みとなるか,すべてのバッチデータが処理済みとならないかのどちらかです。