Adabas トリガドライバは、Adabas ニュークリアスの一部として実行されます。 一般にトリガの実行時処理全体を制御します。 トリガを起動するかどうか、Natural トリガドライバを開始するかどうか、および相互に作用するかどうかを判断して、プロシージャが正確に適切な時間の範囲で処理するようにします。
このドキュメントでは、次のトピックについて説明します。
Adabas ニュークリアスの開始時に、ADARUN パラメータ SPT=YES が指定されているかどうかを判断します。指定されている場合は、Adabas トリガドライバに制御を渡して初期化できるようにします。 初期化時に、Adabas トリガドライバは、以下に説明するようなアクティビティを実行します。
Adabas トリガドライバは、Adabas トリガプロファイルを確認し、セッションのトリガとストアドプロシージャの処理時に使用されるセッションパラメータを抽出します。 トリガファイルにプロファイルが存在しない場合、ニュークリアスの Adabas トリガとストアドプロシージャ機能の初期化は、適切なエラーメッセージを表示して終了します。
Adabas トリガドライバは、プロファイルで "トリガステータス" および "ストアドプロシージャ ステータス" パラメータ設定を確認します。
サブシステム名。プロセスを実行するリンク先の Natural ニュークリアスの名前、つまり、インストール手順のパート 3 で Natural ニュークリアスに割り当てられた名前に対応する必要があります。
起動されるトリガによって生成されるワークロードを処理するために、開始する必要のあるサブシステムの数。
Adabas トリガドライバは、トリガファイルにトリガ定義が 1 つ以上存在することを確認します。 トリガ定義がない場合、トリガステータスが "非アクティブ" に設定されている場合でも、Adabas トリガとストアドプロシージャ機能は初期化されず、適切なエラーメッセージが表示されます。
Adabas トリガとストアドプロシージャ機能で必要になるストレージの合計は、次の条件で変わります。
必要なワークエリアのサイズ
トリガテーブル、プレトリガキュー、およびポストトリガキューに必要なバッファサイズ
Natural サブシステムに必要な容量
Natural サブシステムに必要な容量は、Natural ニュークリアスのサイズと、Natural 環境で必要な各種バッファ(ESIZE、DATSIZE、FSIZE など)のサイズによって決まります。
Adabas ニュークリアスのリージョンやアドレススペースの全体サイズが小さすぎる場合、Natural サブシステムを実行できません。 この場合に通常表示されるエラーメッセージは、"ストレージが不足"、またはサブシステムのアベンドを表します(レスポンスコード 40000109 または 40000008 が返される)。 このような場合は、リージョンやアドレススペースのサイズを増やすか、またはプロシージャの実行に使用する Natural サブシステムの数を減らしてください。
Natural ニュークリアスを分割して、ニュークリアスのストレージ要件を最小化することをお勧めします。
トリガファイルにはトリガを 1 つ以上定義する必要があります。そうでない場合、プロセスは続行できません。
Adabas トリガドライバがトリガファイルの正当性を確認したら、トリガ定義が読み込まれ、エントリがトリガテーブルに追加されます。 ニュークリアスクラスタ環境では、トリガテーブルはニュークリアスごとに再読み込みされませんが、すでにアクティブなニュークリアスから取得されます。
システムの整合性を維持するために、REFRESH コマンドがトリガメンテナンス機能から発行されるまで、トリガテーブルは新規、修正、または削除されたトリガで更新されません(「トリガテーブルの更新」を参照)。
トリガテーブルにより、パフォーマンスは向上します。 Adabas トリガドライバは、コマンドの処理時にトリガファイル自体でトリガの存在を確認するのではなく、トリガテーブル、つまりメモリ内のバッファを確認するにすぎません。 テーブルの順序によって、トリガドライバは、トリガを起動するかどうかをすばやく判断できるようになります。
トリガファイルを読み込んでトリガテーブルのエントリを判断するときに、Adabas トリガドライバは次の処理を行います。
トリガ、チェックポイント、またはセキュリティファイルのエントリをすべて無視します。
非アクティブ化されたトリガをロードします。ただし、トリガメンテナンス機能のトリガ修正機能からトリガがアクティブ化されるまで無視します。 「単一トリガの定義」を参照してください。
データベースの最大ファイル番号を判断し(使用されている最大のファイル番号 + 10)、最大番号よりも大きいファイル番号に対するトリガをすべて無視します。
範囲外のファイル番号を無視すると、REFRESH コマンドの使用時に問題が発生する可能性があります。 解決方法として、実際の最大ファイル番号よりも大きいファイル番号のダミーファイルをロードする方法があります。 これで、実際のファイル番号よりも大きく、ダミーファイル番号よりも小さいファイル番号の新しいファイルを追加できるようになります。 ニュークリアスの初期化時に固定サイズバッファを確立することで、このバッファのストレージ要件は最小化されます。 2 バイトファイル番号を使用する場合、合計の最大サイズが非常に大きくなる可能性があります。
Adabas トリガドライバが開始されると、プロシージャを実際に実行する Natural サブシステムが開始されます。 Adabas トリガプロファイルの "最大サブシステム" パラメータによって、開始するサブシステム数(1~10)が決まります。
各サブシステムは、通常、Adabas アドレススペース内で実行するように最低限修正されたバッチ Natural ニュークリアスです。 これは、MPM 起動 JCL/JCS で指定されるリージョンサイズに影響します。
サブシステムが開始すると、Adabas トリガドライバは、サブシステムのステータスやアクティビティにおけるすべての変更を記録します。そのため、サブシステムが呼び出す Adabas トリガドライバとプロシージャのどちらに対しても、各サブシステムは自身をユニークに識別できます。 ユーザーは、トリガメンテナンスの一部であるサブシステムアクティビティ機能を使用して、これらのアクティビティを監視できます。
Natural サブシステムがアクティブになると、次の処理が行われます。
Natural トリガドライバが制御を取得します。
Adabas トリガドライバは、ストアドプロシージャ要求またはトリガの起動により発生する可能性があるプロシージャの処理をサブシステムが実行可能な状態であることが通知されます。
サブシステムキューには、処理を待機している各 Natural サブシステムのエントリが格納されます。 Adabas トリガドライバがサブシステムを必要とすると、サブシステムキューを確認して、利用可能なサブシステムキューを調べます。
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 サブシステムが処理を待機中の場合、直ちにトリガ要求が渡されます。 それ以外の場合、次のサブシステムが使用可能になるまで、トリガ要求はプレコマンドトリガキューまたはポストコマンドトリガキュー内に残ります。
トリガ要求がプレトリガキューまたはポストトリガキューに置かれ、サブシステムがその要求を受け入れると、Natural トリガドライバの制御下で処理が続行されます。
1 つのコマンドに対して起動できるのは、結果に関係なく 2 つのトリガ(1 つのプレコマンドトリガと 1 つのポストコマンドトリガ)のみです。
コマンドの結果、トリガが起動すると、トリガが非同期と同期のどちらであるか確認されます。
トリガが非同期の場合、コマンドはトリガされたプロシージャの完了を待機しません。 コマンドは解放され、トリガがプレコマンドとポストコマンドのどちらであるかに応じてプロセスは正常に継続されます。
プレコマンド | コマンドは、Adabas スレッド内の処理で使用できます。 トリガされたプロシージャは、コマンドの実行後、またはコマンドの実行と同時に処理できます。 |
ポストコマンド | トリガされたプロシージャとコマンドは、独立して処理されます。 プロシージャの結果に関係なく、トリガが起動されるとユーザーに通知されます。 |
トリガが同期(関与または非関与)の場合、Natural トリガドライバが Adabas トリガドライバに対してプロシージャの実行完了を通知するまで、コマンドは保留されます。
リターンコードがゼロの場合、コマンドは解放されて処理を続行します。
リターンコードがゼロ以外の場合、ユーザーはレスポンスコード 155 または 156 と次の情報を受け取ります。
アディション 3 フィールドには、起動したトリガの結果として実行されたプロシージャの名前が格納されます。
アディション 4 フィールドの最初の 2 バイトには、プロシージャからの実際のリターンコードが格納されます。
アディション 4 フィールドの次の 2 バイトには、起動したトリガのタイプを示すサブコードが格納されます。
サブコード 15 は、プレコマンドトリガを表します。
サブコード 16 は、ポストコマンドトリガを表します。
プロシージャを実行すると、結果がトリガ要求エントリに格納され、ステータスが適切に更新されます。 Adabas トリガドライバは、この処理を検出すると、コマンドのトリガ処理を "ファイナライズ" します。
プレコマンドトリガとポストコマンドトリガのどちらでも、プロシージャからのリターンコードによって、結果の処理方法を指定します。次のセクションで、この結果の処理方法について説明します。
リターンコード | 処理内容 |
---|---|
ゼロ | コマンドは "解放" されて、実行できるようになります。 |
ゼロ以外 | コマンドは実行されず、ユーザーは Adabas コントロールブロックのレスポンスコードフィールドでレスポンスコード 155 を受け取ります。 |
コマンドが Adabas スレッドによって実行されると、ポストコマンドトリガ処理でそのコマンドを再選択することができます。
同期トリガでリターンコード "1" は、プロシージャが処理を正常に完了したことを表します。 Adabas コントロールブロックのレスポンスコードフィールドは、正常終了を表すゼロに設定されます。 コマンドは、ニュークリアスによる実行から "解放" されていませんが、その代わりにプロシージャの結果が直ちにユーザーに返されます。
この特殊な処理で使用するプロシージャは、レコードバッファに対する読み書きアクセス権を持ち、ストアドプロシージャの場合と同様の方法でコマンドを処理する必要があります。 「フォーマットバッファとレコードバッファの使用」を参照してください。
コマンドの実行前に、プレコマンドトリガのプロシージャでレコードバッファの内容を修正することができ、これはコマンドを更新したり格納したりするときに便利です。
リターンコード | 処理内容 |
---|---|
ゼロ | コマンドは成功したとみなされ、ユーザーは Adabas コントロールブロックでレスポンスコード 0(ゼロ)の通知を受けます。 |
ゼロ以外 | Adabas コントロールブロックでレスポンスコード 156 が返されます。 プロシージャはゼロ以外のコードを返しても、実際にはコマンドは成功していることがあります。コマンドの実行結果は、そのコマンドを発行したアプリケーションで解釈する必要があります。 |
注意:
ポストコマンドトリガが起動し、プロシージャからのリターンコードがゼロ以外の場合、コマンドが正常に実行された場合でも、レコードバッファ内のデータは返されません。
同期でかつレコードバッファに対して読み書きアクセス権を持つポストコマンドトリガは、実行に成功するかどうかに関係なく、レコードバッファを修正していることがあります。
関与トリガの場合、トリガの結果によって、コマンドの結果が変更されている可能性があります。 例えば正常に実行された UPDATE コマンドによってポストコマンドトリガが起動し、このトリガのプロシージャが正常に完了しなかった場合、BT コマンドが実行されることもあれば、実行されないこともあります。 ユーザーが通知を受ける場合は、レスポンスコード 156 が返されます。 元のコマンドを発行したアプリケーションは、UPDATE コマンドが有効なままであるかどうかを判断して、適切なアクション(ET または BT)を実行する必要があります。
シャットダウンは、次の状況で発生する可能性があります。
Adabas トリガドライバは、失敗したサブシステムを記録します。 すべてのサブシステムが失敗すると、Adabas トリガドライバは、プロシージャをこれ以上処理することができないと判断し、終了します。 シャットダウン処理は、"エラーアクション" 値によって異なります(表「エラーアクション」を参照)。
ニュークリアスが ADAEND または HALT オペレータコマンドを受け取り、Adabas トリガドライバにシャットダウンを指示します。
HALT | Adabas トリガドライバは直ちに終了します。 |
ADAEND | すべてのサブタスクアクティビティがステータスが ET になったときに、Adabas トリガドライバが終了します。 サブタスクがビジーでかつ ET ロジックに関わっている場合、現在のニュークリアスにコマンドを発行している途中でも、完了することができます。そうでない場合は、コンソールにメッセージが表示され(メッセージ ADAN9M を参照)、サブタスクはトランザクションが未完了のまま終了します。 |
シャットダウン処理のステップは次のとおりです。
プレトリガキューとポストトリガキューで、待機中のトリガがないかどうか確認されます。 同期トリガの実行完了を待機しているすべてのユーザーに対して、レスポンスコード 148 が発行されます。
ユーザーは、通常の方法で、完了済みのポストコマンドトリガについて通知を受けます。
完了済みのプレコマンドトリガに対して、レスポンスコード 148 が発行されます。これらは Adabas スレッドで処理されないためです。 これらのコマンドが ET トランザクションの一部である場合、ユーザーは BT および ET コマンドを適宜発行する必要があります。
シャットダウン開始後に検出されたすべてのポストコマンドトリガに対して、レスポンスコード 157("コマンド拒否")が発行されます。 シャットダウンの開始前にコマンドは実行されましたが、トリガされたプロシージャは実行されません。
5 秒後にアクティブなままのすべてのサブシステムが強制的に終了し、メッセージがコンソールに表示されます。 実行したままのプロシージャが含まれるサブシステムは "アクティブ" であるとみなされます。Natural プログラムがバッファプール内にあり、プログラムは別のデータベースに対するデータ呼び出しを発行中である可能性も、まったく発行していない可能性もあります。 この場合、現在のデータベースに対して発行された "停止" は、効果がないことがあります。
すべてのサブシステムがシャットダウンされます。
トリガとストアドプロシージャの合計数がコンソールに書き込まれ、Adabas トリガプロファイルでトリガのステータスフィールドが "非アクティブ" に設定されます。 ニュークリアスは、通常の方法でシャットダウン処理を続行します。
Adabas トリガドライバ自体によってシャットダウンが要求された場合のシャットダウン処理は、Adabas トリガプロファイルのエラーアクションフィールドに割り当てられた値によって異なります。
処理内容 | シャットダウン処理 |
---|---|
停止 | ニュークリアスも終了する必要があります。 ADAEND 要求は、Adabas トリガドライバ自体から発行されます。 サブシステム内でまだ実行中のすべてのユーザーアプリケーションが終了します。 |
無視 | Adabas トリガとストアドプロシージャ機能によって、Adabas ニュークリアスが終了しますが、ニュークリアスの処理は、ADARUN パラメータ SPT=NO が指定されたのと同様に通常の方法で続行します。 拡張コマンド処理を実行するトリガは起動されず、整合性の問題が発生する可能性があります。 |
拒否 | 通常ならトリガが起動されるすべてのコマンドで、レスポンスコード 157 が返されます。 Adabas トリガとストアドプロシージャ機能はアクティブなままですが、すべてのサブシステムはシャットダウンし、プロシージャの処理は中断されます。 |
ニュークリアスクラスタ環境では、1 つのニュークリアスが "無視" または "拒否" ステータスに設定されると、クラスタ内のすべてのニュークリアスもそのステータスに設定されます。
次のコンポーネントがシャットダウンする状況については、「シャットダウン」を参照してください。
Adabas ニュークリアス、Adabas トリガドライバ、およびすべてのサブシステム
Adabas トリガドライバとすべてのサブシステム、ただし Adabas ニュークリアスを除く
すべてのサブシステム、ただし Adabas トリガとストアドプロシージャ機能または Adabas ニュークリアスを除く
NATPARM で DU=OFF(デフォルト、アベンド時にメモリダンプが生成されない)が指定された場合、Natural ESTAE/STXIT がセッション時にアクティブになります。
Natural ESTAE/STXIT がアクティブなときに Natural サブシステム内でプログラムのアベンドが発生すると、アベンドがトラップされます。Natural ESTAE/STXIT 出口は制御を取得し、クリーンアップと Adabas トリガドライバへの通知を行い、Natural トリガドライバを再スタートします。
このようにして、Natural セッションは終了せずに再スタートします。 これは重要なパフォーマンスの考慮事項です。
DU=ON を使用する場合、ESTAE/STXIT はアクティブ化されず、サブシステムは異常終了します。 サブシステムを終了して再スタートするために Adabas トリガドライバを再スタートする必要がある場合は、パフォーマンスが低下します。
実行中のプロシージャがタイムアウトリミットを超えたり、または処理の完了前に DBA によってキャンセルされたりすることがあります。 (タイムアウトは、CPU タイムの使用に対する経過時間を意味します)。
プロシージャにおけるこれら 2 つの "異常な" 終了は、似ていますが、次の点が異なります。
キャンセルは、トリガメンテナンス機能から手動で行います。
タイムアウトは、Adabas トリガプロファイルのアクティビティタイムアウト設定に基づいて、自動的に発生します。
実行中のプロシージャは、待機中、ループしている、または単に想定よりも長く実行中など、あらゆる段階で終了させる必要性が生じる可能性があります。 処理をインターセプトする確実な唯一の方法は、サブシステム自体を終了することです。 この終了を確認するには、トリガメンテナンス機能からサブシステムを監視します。「サブシステムアクティビティ」を参照してください。
トリガが同期の場合、ユーザーは、サブシステムが終了したことを通知される必要があります。 トリガタイプ(プレコマンドまたはポストコマンド)に応じて、レスポンスコード 155 または 156 と、タイムアウトを表すサブコード 9 が設定されます。 ユーザーはサブシステムがタイムアウトしたのか意図的に終了されたのか常に通知を受けます。コンソールには追加情報のメッセージが書き込まれます。
異常終了が発生した場合は、理由を確認して、問題を修正してください。 それでもこの現象が繰り返し発生する場合は、問題が解決するまでトリガを非アクティブ化してください。 プロファイルのトリガアクティビティの記録オプションを使用すると、理由を簡単に特定できます。
Natural が回復できず、サブシステムが終了する場合、Adabas トリガドライバはエラーの通知を受け、メッセージがコンソールに書き込まれます。
Natural サブシステムは、終了すると自動的に再スタートします。
再スタートに成功すると、サブシステムは通常の方法で再初期化されます。 現在実行する処理がない場合、サブシステムはキューに置かれ、新しいトリガが起動されてプロシージャの処理が必要であることを Adabas トリガドライバが通知するまで待機します。
再スタートに失敗すると、さらに 2 回再スタートを試みます。 3 回連続で再スタートに失敗した後で起動に失敗すると、サブシステムは永続的に非アクティブ化され、ユーザーに通知するメッセージがコンソールに表示されます。 ニュークリアスをシャットダウンして再スタートするまで、そのサブシステムは再アクティブ化できません。
Natural トリガドライバを再開する再スタートルーチンは、STP です。
同期トリガによる処理の完了を待機しているユーザーは、トリガが正常に完了しなかったことの通知を受けます。 レスポンスコード 155 または 156 と、アディション 4 フィールドに追加情報が返されます。
トリガされたプロシージャはコマンドを拒否することがあるため、Adabas トリガとストアドプロシージャを実行するときは、ユーザーが発行したコマンドが Adabas スレッドで実行されないことも、ニュークリアスのスーパーバイザに認識されないこともあります。
そのため、Adabas トリガとストアドプロシージャ機能で次のログを取得する必要があります。
PC コマンド(ストアドプロシージャ要求)を受け取ったとき
コマンドがプレコマンドトリガまたはポストコマンドトリガで選択されたとき
プレトリガまたはポストトリガされたコマンドがゼロ以外のレスポンスを受け取ったとき
コマンドログレコードを処理するときのログレコードタイプは次のとおりです。
プレコマンドトリガの場合は X'0005'
ポストコマンドトリガの場合は X'0006'
ログレコードの 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 番目のパラメータ)はゼロに設定されます。