バージョン 8.1.3
 —  トリガとストアドプロシージャ  —

処理とパフォーマンス

Adabas トリガドライバは、Adabas ニュークリアスの一部として実行されます。 一般にトリガの実行時処理全体を制御します。 トリガを起動するかどうか、Natural トリガドライバを開始するかどうか、および相互に作用するかどうかを判断して、プロシージャが正確に適切な時間の範囲で処理するようにします。

このドキュメントでは、次のトピックについて説明します。


初期化

Adabas ニュークリアスの開始時に、ADARUN パラメータ SPT=YES が指定されているかどうかを判断します。指定されている場合は、Adabas トリガドライバに制御を渡して初期化できるようにします。 初期化時に、Adabas トリガドライバは、以下に説明するようなアクティビティを実行します。

Adabas トリガプロファイルの確認

Adabas トリガドライバは、Adabas トリガプロファイルを確認し、セッションのトリガとストアドプロシージャの処理時に使用されるセッションパラメータを抽出します。 トリガファイルにプロファイルが存在しない場合、ニュークリアスの Adabas トリガとストアドプロシージャ機能の初期化は、適切なエラーメッセージを表示して終了します。

トリガが 1 つ以上存在することの確認

Adabas トリガドライバは、トリガファイルにトリガ定義が 1 つ以上存在することを確認します。 トリガ定義がない場合、トリガステータスが "非アクティブ" に設定されている場合でも、Adabas トリガとストアドプロシージャ機能は初期化されず、適切なエラーメッセージが表示されます。

ストレージの確保

Adabas トリガとストアドプロシージャ機能で必要になるストレージの合計は、次の条件で変わります。

Natural サブシステムに必要な容量は、Natural ニュークリアスのサイズと、Natural 環境で必要な各種バッファ(ESIZE、DATSIZE、FSIZE など)のサイズによって決まります。

Adabas ニュークリアスのリージョンやアドレススペースの全体サイズが小さすぎる場合、Natural サブシステムを実行できません。 この場合に通常表示されるエラーメッセージは、"ストレージが不足"、またはサブシステムのアベンドを表します(レスポンスコード 40000109 または 40000008 が返される)。 このような場合は、リージョンやアドレススペースのサイズを増やすか、またはプロシージャの実行に使用する Natural サブシステムの数を減らしてください。

Natural ニュークリアスを分割して、ニュークリアスのストレージ要件を最小化することをお勧めします。

トリガテーブルの作成

トリガファイルにはトリガを 1 つ以上定義する必要があります。そうでない場合、プロセスは続行できません。

Adabas トリガドライバがトリガファイルの正当性を確認したら、トリガ定義が読み込まれ、エントリがトリガテーブルに追加されます。 ニュークリアスクラスタ環境では、トリガテーブルはニュークリアスごとに再読み込みされませんが、すでにアクティブなニュークリアスから取得されます。

システムの整合性を維持するために、REFRESH コマンドがトリガメンテナンス機能から発行されるまで、トリガテーブルは新規、修正、または削除されたトリガで更新されません(「トリガテーブルの更新」を参照)。

トリガテーブルにより、パフォーマンスは向上します。 Adabas トリガドライバは、コマンドの処理時にトリガファイル自体でトリガの存在を確認するのではなく、トリガテーブル、つまりメモリ内のバッファを確認するにすぎません。 テーブルの順序によって、トリガドライバは、トリガを起動するかどうかをすばやく判断できるようになります。

トリガファイルを読み込んでトリガテーブルのエントリを判断するときに、Adabas トリガドライバは次の処理を行います。

範囲外のファイル番号を無視すると、REFRESH コマンドの使用時に問題が発生する可能性があります。 解決方法として、実際の最大ファイル番号よりも大きいファイル番号のダミーファイルをロードする方法があります。 これで、実際のファイル番号よりも大きく、ダミーファイル番号よりも小さいファイル番号の新しいファイルを追加できるようになります。 ニュークリアスの初期化時に固定サイズバッファを確立することで、このバッファのストレージ要件は最小化されます。 2 バイトファイル番号を使用する場合、合計の最大サイズが非常に大きくなる可能性があります。

Natural サブシステムの開始

Adabas トリガドライバが開始されると、プロシージャを実際に実行する Natural サブシステムが開始されます。 Adabas トリガプロファイルの "最大サブシステム" パラメータによって、開始するサブシステム数(1~10)が決まります。

各サブシステムは、通常、Adabas アドレススペース内で実行するように最低限修正されたバッチ Natural ニュークリアスです。 これは、MPM 起動 JCL/JCS で指定されるリージョンサイズに影響します。

サブシステムが開始すると、Adabas トリガドライバは、サブシステムのステータスやアクティビティにおけるすべての変更を記録します。そのため、サブシステムが呼び出す Adabas トリガドライバとプロシージャのどちらに対しても、各サブシステムは自身をユニークに識別できます。 ユーザーは、トリガメンテナンスの一部であるサブシステムアクティビティ機能を使用して、これらのアクティビティを監視できます。

Natural サブシステムがアクティブになると、次の処理が行われます。

サブシステムキューには、処理を待機している各 Natural サブシステムのエントリが格納されます。 Adabas トリガドライバがサブシステムを必要とすると、サブシステムキューを確認して、利用可能なサブシステムキューを調べます。

Top of page

プロシージャの確認

Adabas ニュークリアスが初期化されると、ユーザー処理は通常どおり継続します。 Adabas トリガドライバは、ニュークリアスが受け取るコマンドごとに、トリガを起動する必要があるかどうかを決定します。 "非アクティブ" とマークされたトリガテーブル内のエントリは無視されます。

プレコマンドトリガの場合、Adabas トリガドライバは Adabas スレッドで処理されるコマンドが選択される前にトリガをチェックします。 このようなコマンドには、READ、FIND、STORE、DELETE、UPDATE コマンドなどがあります。 これらのコマンドに対して、Adabas トリガドライバは起動するトリガがあるかどうかを判断します。ない場合、コマンド処理は通常どおり続行します。 エンドトランザクション(ET)、クローズ(CL)、コマンド ID の解放(RC)などのコマンドは確認されませんが、ニュークリアスに直接渡されて通常の処理が行われます。 ストアドプロシージャ要求に対しては、トリガの確認は行われません。

Adabas でコマンドが正常に処理されレスポンスコードがゼロになると、Adabas トリガドライバは起動するポストコマンドトリガがあるかどうか調べます。 ない場合、ユーザーは通常の方法で通知を受けます。 プレコマンドトリガ、またはポストコマンドトリガの確認の結果、トリガを起動する場合、Adabas トリガドライバはトリガ処理に進みます。

トリガテーブルのスキャン

コマンドがトリガを起動する条件を満たしていると判断されると、トリガテーブルがスキャンされます。 パフォーマンス上の理由から、トリガのスキャン順序はシーケンス、または ユーザーによってトリガに割り当てられたプライオリティによって決まります(「複数のトリガ定義」を参照)。

2 つのトリガが同じコマンドクラスに存在し、プライオリティが同じ場合、トリガファイルからの読み込み順(つまりファイル上のレコードの ISN 順)でトリガがスキャンされます。 そのため、各トリガのプライオリティを正しく指定することが重要です。

トリガは、次の一般的な順序でスキャンされます。

シーケンス フィールド コマンド
1 特定フィールド 特定コマンド
2 任意のフィールド 特定コマンド
3 特定フィールド 任意のコマンド
4 任意のフィールド 任意のコマンド

プレコマンドトリガとポストコマンドトリガのキューエントリの作成

コマンドの結果がトリガの起動である場合、またはコマンドがストアドプロシージャ要求であると Adabas トリガドライバが判断した場合、次の場所でエントリが作成されます。

エントリには、トリガを起動するコマンドと、トリガテーブル内の対応するエントリ(例えば実行するプロシージャの詳細)との両方から取得した情報が含まれます。 また、エントリを使用すると、Adabas トリガドライバは起動されたトリガのステータスを記録できます。

Natural サブシステムが処理を待機中の場合、直ちにトリガ要求が渡されます。 それ以外の場合、次のサブシステムが使用可能になるまで、トリガ要求はプレコマンドトリガキューまたはポストコマンドトリガキュー内に残ります。

Top of page

プロシージャの処理

トリガ要求がプレトリガキューまたはポストトリガキューに置かれ、サブシステムがその要求を受け入れると、Natural トリガドライバの制御下で処理が続行されます。

1 つのコマンドに対して起動できるのは、結果に関係なく 2 つのトリガ(1 つのプレコマンドトリガと 1 つのポストコマンドトリガ)のみです。

コマンドの結果、トリガが起動すると、トリガが非同期と同期のどちらであるか確認されます。

非同期トリガ

トリガが非同期の場合、コマンドはトリガされたプロシージャの完了を待機しません。 コマンドは解放され、トリガがプレコマンドとポストコマンドのどちらであるかに応じてプロセスは正常に継続されます。

プレコマンド コマンドは、Adabas スレッド内の処理で使用できます。 トリガされたプロシージャは、コマンドの実行後、またはコマンドの実行と同時に処理できます。
ポストコマンド トリガされたプロシージャとコマンドは、独立して処理されます。 プロシージャの結果に関係なく、トリガが起動されるとユーザーに通知されます。

同期トリガ

トリガが同期(関与または非関与)の場合、Natural トリガドライバが Adabas トリガドライバに対してプロシージャの実行完了を通知するまで、コマンドは保留されます。

リターンコードがゼロの場合、コマンドは解放されて処理を続行します。

リターンコードがゼロ以外の場合、ユーザーはレスポンスコード 155 または 156 と次の情報を受け取ります。

Top of page

結果の処理

プロシージャを実行すると、結果がトリガ要求エントリに格納され、ステータスが適切に更新されます。 Adabas トリガドライバは、この処理を検出すると、コマンドのトリガ処理を "ファイナライズ" します。

プレコマンドトリガとポストコマンドトリガのどちらでも、プロシージャからのリターンコードによって、結果の処理方法を指定します。次のセクションで、この結果の処理方法について説明します。

プレコマンドトリガ

リターンコード 処理内容
ゼロ コマンドは "解放" されて、実行できるようになります。
ゼロ以外 コマンドは実行されず、ユーザーは Adabas コントロールブロックのレスポンスコードフィールドでレスポンスコード 155 を受け取ります。

コマンドが Adabas スレッドによって実行されると、ポストコマンドトリガ処理でそのコマンドを再選択することができます。

同期プレコマンドトリガの特殊な処理

同期トリガでリターンコード "1" は、プロシージャが処理を正常に完了したことを表します。 Adabas コントロールブロックのレスポンスコードフィールドは、正常終了を表すゼロに設定されます。 コマンドは、ニュークリアスによる実行から "解放" されていませんが、その代わりにプロシージャの結果が直ちにユーザーに返されます。

この特殊な処理で使用するプロシージャは、レコードバッファに対する読み書きアクセス権を持ち、ストアドプロシージャの場合と同様の方法でコマンドを処理する必要があります。 「フォーマットバッファとレコードバッファの使用」を参照してください。

コマンドの実行前に、プレコマンドトリガのプロシージャでレコードバッファの内容を修正することができ、これはコマンドを更新したり格納したりするときに便利です。

ポストコマンドトリガ

リターンコード 処理内容
ゼロ コマンドは成功したとみなされ、ユーザーは Adabas コントロールブロックでレスポンスコード 0(ゼロ)の通知を受けます。
ゼロ以外 Adabas コントロールブロックでレスポンスコード 156 が返されます。 プロシージャはゼロ以外のコードを返しても、実際にはコマンドは成功していることがあります。コマンドの実行結果は、そのコマンドを発行したアプリケーションで解釈する必要があります。

注意:
ポストコマンドトリガが起動し、プロシージャからのリターンコードがゼロ以外の場合、コマンドが正常に実行された場合でも、レコードバッファ内のデータは返されません。

同期ポストコマンドトリガの特殊な処理

同期でかつレコードバッファに対して読み書きアクセス権を持つポストコマンドトリガは、実行に成功するかどうかに関係なく、レコードバッファを修正していることがあります。

関与トリガの場合、トリガの結果によって、コマンドの結果が変更されている可能性があります。 例えば正常に実行された UPDATE コマンドによってポストコマンドトリガが起動し、このトリガのプロシージャが正常に完了しなかった場合、BT コマンドが実行されることもあれば、実行されないこともあります。 ユーザーが通知を受ける場合は、レスポンスコード 156 が返されます。 元のコマンドを発行したアプリケーションは、UPDATE コマンドが有効なままであるかどうかを判断して、適切なアクション(ET または BT)を実行する必要があります。

Top of page

シャットダウン

シャットダウンは、次の状況で発生する可能性があります。

シャットダウン処理のステップ

Start of instruction setシャットダウン処理のステップは次のとおりです。

  1. プレトリガキューとポストトリガキューで、待機中のトリガがないかどうか確認されます。 同期トリガの実行完了を待機しているすべてのユーザーに対して、レスポンスコード 148 が発行されます。

  2. ユーザーは、通常の方法で、完了済みのポストコマンドトリガについて通知を受けます。

  3. 完了済みのプレコマンドトリガに対して、レスポンスコード 148 が発行されます。これらは Adabas スレッドで処理されないためです。 これらのコマンドが ET トランザクションの一部である場合、ユーザーは BT および ET コマンドを適宜発行する必要があります。

  4. シャットダウン開始後に検出されたすべてのポストコマンドトリガに対して、レスポンスコード 157("コマンド拒否")が発行されます。 シャットダウンの開始前にコマンドは実行されましたが、トリガされたプロシージャは実行されません。

  5. 5 秒後にアクティブなままのすべてのサブシステムが強制的に終了し、メッセージがコンソールに表示されます。 実行したままのプロシージャが含まれるサブシステムは "アクティブ" であるとみなされます。Natural プログラムがバッファプール内にあり、プログラムは別のデータベースに対するデータ呼び出しを発行中である可能性も、まったく発行していない可能性もあります。 この場合、現在のデータベースに対して発行された "停止" は、効果がないことがあります。

  6. すべてのサブシステムがシャットダウンされます。

  7. トリガとストアドプロシージャの合計数がコンソールに書き込まれ、Adabas トリガプロファイルでトリガのステータスフィールドが "非アクティブ" に設定されます。 ニュークリアスは、通常の方法でシャットダウン処理を続行します。

エラーアクション

Adabas トリガドライバ自体によってシャットダウンが要求された場合のシャットダウン処理は、Adabas トリガプロファイルのエラーアクションフィールドに割り当てられた値によって異なります。

処理内容 シャットダウン処理
停止 ニュークリアスも終了する必要があります。 ADAEND 要求は、Adabas トリガドライバ自体から発行されます。 サブシステム内でまだ実行中のすべてのユーザーアプリケーションが終了します。
無視 Adabas トリガとストアドプロシージャ機能によって、Adabas ニュークリアスが終了しますが、ニュークリアスの処理は、ADARUN パラメータ SPT=NO が指定されたのと同様に通常の方法で続行します。 拡張コマンド処理を実行するトリガは起動されず、整合性の問題が発生する可能性があります。
拒否 通常ならトリガが起動されるすべてのコマンドで、レスポンスコード 157 が返されます。 Adabas トリガとストアドプロシージャ機能はアクティブなままですが、すべてのサブシステムはシャットダウンし、プロシージャの処理は中断されます。

ニュークリアスクラスタ環境では、1 つのニュークリアスが "無視" または "拒否" ステータスに設定されると、クラスタ内のすべてのニュークリアスもそのステータスに設定されます。

Top of page

異常終了

次のコンポーネントがシャットダウンする状況については、「シャットダウン」を参照してください。

Natural ESTAE/STXIT 処理

NATPARM で DU=OFF(デフォルト、アベンド時にメモリダンプが生成されない)が指定された場合、Natural ESTAE/STXIT がセッション時にアクティブになります。

Natural ESTAE/STXIT がアクティブなときに Natural サブシステム内でプログラムのアベンドが発生すると、アベンドがトラップされます。Natural ESTAE/STXIT 出口は制御を取得し、クリーンアップと Adabas トリガドライバへの通知を行い、Natural トリガドライバを再スタートします。

このようにして、Natural セッションは終了せずに再スタートします。 これは重要なパフォーマンスの考慮事項です。

DU=ON を使用する場合、ESTAE/STXIT はアクティブ化されず、サブシステムは異常終了します。 サブシステムを終了して再スタートするために Adabas トリガドライバを再スタートする必要がある場合は、パフォーマンスが低下します。

Natural サブシステムのアベンド

実行中のプロシージャがタイムアウトリミットを超えたり、または処理の完了前に DBA によってキャンセルされたりすることがあります。 (タイムアウトは、CPU タイムの使用に対する経過時間を意味します)。

プロシージャにおけるこれら 2 つの "異常な" 終了は、似ていますが、次の点が異なります。

実行中のプロシージャは、待機中、ループしている、または単に想定よりも長く実行中など、あらゆる段階で終了させる必要性が生じる可能性があります。 処理をインターセプトする確実な唯一の方法は、サブシステム自体を終了することです。 この終了を確認するには、トリガメンテナンス機能からサブシステムを監視します。「サブシステムアクティビティ」を参照してください。

トリガが同期の場合、ユーザーは、サブシステムが終了したことを通知される必要があります。 トリガタイプ(プレコマンドまたはポストコマンド)に応じて、レスポンスコード 155 または 156 と、タイムアウトを表すサブコード 9 が設定されます。 ユーザーはサブシステムがタイムアウトしたのか意図的に終了されたのか常に通知を受けます。コンソールには追加情報のメッセージが書き込まれます。

異常終了が発生した場合は、理由を確認して、問題を修正してください。 それでもこの現象が繰り返し発生する場合は、問題が解決するまでトリガを非アクティブ化してください。 プロファイルのトリガアクティビティの記録オプションを使用すると、理由を簡単に特定できます。

Natural サブシステムの再スタート

Natural が回復できず、サブシステムが終了する場合、Adabas トリガドライバはエラーの通知を受け、メッセージがコンソールに書き込まれます。

Natural サブシステムは、終了すると自動的に再スタートします。

Natural トリガドライバを再開する再スタートルーチンは、STP です。

同期トリガによる処理の完了を待機しているユーザーは、トリガが正常に完了しなかったことの通知を受けます。 レスポンスコード 155 または 156 と、アディション 4 フィールドに追加情報が返されます。

Top of page

コマンドロギング

トリガされたプロシージャはコマンドを拒否することがあるため、Adabas トリガとストアドプロシージャを実行するときは、ユーザーが発行したコマンドが Adabas スレッドで実行されないことも、ニュークリアスのスーパーバイザに認識されないこともあります。

そのため、Adabas トリガとストアドプロシージャ機能で次のログを取得する必要があります。

コマンドログレコードを処理するときのログレコードタイプは次のとおりです。

ログレコードの Adabas コントロールブロックで、アディション 3 フィールドには呼び出されるプロシージャの名前が格納され、アディション 4 フィールドには、プロシージャに関する次の情報が格納されます。

バイト 内容
1~2 プロシージャからのレスポンスコード。
3 プレトリガは "P"、プロシージャ呼び出しは "R"、ポストトリガは "S"
4 非同期は "A"、非関与は "N"、関与は "P"
5 読み込みは "R"、検索は "F"、更新は "U"、格納/追加は "S"、削除は "D"、プロシージャ呼び出しは "P"
6 フラグ設定:パラメータなしは "1"、レスポンスコードのみは "2"、制御情報は "4"、特別なストアドプロシージャパラメータは "8"、レコードバッファアクセスは "10"、レコードバッファ更新は "80"
7~8 トリガに関連付けられたフィールドの名前

注意:
ゼロ以外のレスポンスを返す非同期トリガに対して、ログは作成されません。 トリガの処理前にコマンドが完了した場合、非同期トリガの CQE アドレス(4 番目のパラメータ)はゼロに設定されます。

Top of page