このドキュメントでは、次のトピックについて説明します。
Natural バッファプールは、同じコンピュータ上で Natural オブジェクトにアクセスする複数の Natural プロセス間で Natural オブジェクトを共有するのに使用されます。 バッファプールとは、コンパイルされた Natural プログラムを実行に備えて配置するストレージエリアのことです。 Natural ユーザーからの Natural オブジェクト要求に応じて、プログラムはバッファプールにまたはバッファプールから移動されます。
Natural ではリエントラントな Natural オブジェクトコードが生成されるので、Natural プログラムの 1 つのコピーを複数のユーザーが同時に実行できます。 この目的のため、各オブジェクトは、呼び出し元が呼び出すたびにロードされるのではなく、システムファイルから Natural バッファプールに 1 回だけロードされます。
以下では次のトピックについて説明します。
バッファプール内のオブジェクトは、プログラムやダイアログなどの実行可能なオブジェクトです。 実行可能なオブジェクトのうち、ローカルデータエリア、パラメータデータエリア、およびコピーコードは、コンパイル目的でのみバッファプールに配置されます。
Natural オブジェクトがバッファプールにロードされると、ディレクトリエントリと呼ばれるコントロールブロックがこのオブジェクトに割り当てられます。 このコントロールブロックには、オブジェクトの名前、オブジェクトが属するライブラリまたはアプリケーション、オブジェクトの取得元のデータベース ID および Natural システムファイル番号などの情報と、いくつかの統計情報(例えば、プログラムを同時に実行しているユーザーの数)が含まれます。
リソースは、リソースが Natural システムファイル(FUSER など)のライブラリにあり、名前がファイル拡張子も含めて 32 文字以内の場合に、バッファプールにロードされます。
環境変数 NATGUI_BMP
に割り当てられたディレクトリにあるか名前が 32
文字を超えるリソースは、アクセスされるたびに Natural プロセスに直接ロードされます(つまり、リソースはバッファプールにロードされません)。
個別の要件に応じて、同じコンピュータ上で同じ Natural バージョンの異なるバッファプールを同時に実行できます。
コンフィグレーションユーティリティで、各バッファプールに対して同期を有効にできます(後述の「バッファプールの設定」も参照)。 同じシステムファイルからのオブジェクトを含み、同期が有効にされているすべてのバッファプールは、自動的に同期されます。
重要:
システムファイルが共有ドライブにある場合は、同期はサーバー上のファイルシステムが NTFS
の場合にのみ実行されます。
同期が有効にされている場合:複数のバッファプールにロードされたオブジェクトが 1 つの Natural プロセスで変更されると、まずそのオブジェクトは無効としてマークされます。 オブジェクトがプロセスで使用されなくなると、バッファプールから削除されます。 次回このオブジェクトがプロセスで要求されると、オブジェクトはバッファプールに再度ロードされます。
ユーザーがプログラムを実行すると、バッファプールマネージャが呼び出されます。 プログラムがすでにバッファプールロードされているかどうかを確認するためにディレクトリエントリが検索されます。 まだロードされていない場合は、コピーが適切なライブラリから取得され、バッファプールにロードされます。
Natural オブジェクトをバッファプールにロードしているときに、新しいディレクトリエントリがこのプログラムを識別するために定義され、新しくロードするオブジェクトを収容するために、現在実行中ではない 1 つまたは複数の他の Natural オブジェクトがバッファプールから削除されることがあります。
この目的のために、バッファプールは現在どのユーザーがどのオブジェクトを使用しているかの記録を管理し、それにより、ユーザーがそのオブジェクトを解放しないで Natural を終了する状況を検出します。 他のアプリケーションに属している新しいオブジェクトを収容するために、未使用または期限切れのオブジェクトがダイナミックに削除されます。
読み取り専用バッファプールとは、読み取りアクセスのみを許可する特別なバッファプールです。 オブジェクトが読み取り専用のバッファプールにない場合、Natural はエラー 82(オブジェクトが見つからない)を発行します。 システムファイルで見つからないオブジェクトの取得が試行されないため、システムファイルおよびバッファプールに対するすべてのロック操作がスキップされます。 アカウントデータは収集されません。 読み取り専用バッファプールにアクセスできるユーザー数に制限はありません。
読み取り専用バッファプールは、コンフィグレーションユーティリティで定義されます(後述の「バッファプールの設定」も参照)。 バッファプールが読み取り専用バッファプールとして定義されている場合は、ユーザー最大数に定義されている値は無視されます。
ユーティリティ NATBPSRV
は、セマフォを読み取り専用バッファプールに割り当てません。 ただし、Natural パラメータファイルの位置に
<バッファプール名>.PRL
ファイル内のプリロードリストが必要です。これは、ローカルコンフィグレーションファイルに定義されます(インストール指定)。
例えば、読み取り専用バッファプールの名前が "ROBP" である場合は、ファイル名は
ROBP.PRL になります。
プリロードリストは、ライブラリ SYSBPM
にある Natural プログラム
CRTPRL
(プリロードリストリストの作成)を使用して生成できます。
このプログラムは、バッファプールの内容を抽出してバッファプールの既存のプリロードデータとマージします。
PRL ファイル内のプリロードリストには、コンマ区切りデータのレコードが次の形式で含まれています。
database-ID,file-number,library,object-name,kind,type
ファイル内のキーワードは、NATBPMON
ユーティリティの
DIR
コマンドで表示されるキーワードと同じ意味を持ちます。
ディレクトリ記述レコード(オブジェクトの種類は、オブジェクトが FILEDIR.SAG の一部であることを意味する "D")を除き、すべてのキーワードに値が割り当てられている必要があります。 例:
キーワード | NATBPSRV
によってバッファプールにロードされる内容
|
---|---|
222,111,MY_LIB,PGM1,G,P |
データベース 222 およびファイル番号 111 にあるライブラリ
MY_LIB のプログラム PGM1 のオブジェクトコード
|
222,113,*,*,D |
FNAT = 222,113 にある
LIBDIR.SAG |
222,111,MY_LIB,*,D |
FUSER = 222,111 にあるライブラリ
MY_LIB の FILEDIR.SAG
|
読み取り専用バッファプールの使用には、アプリケーションの詳細が認識されていなければならないという短所があります(不明オブジェクトはロードできないため)。 これは、アプリケーションで必要なすべてのオブジェクトをプリロードリストに指定する必要があることを意味します。 まれに、アプリケーションで必要なオブジェクトの完全なセットを事前に決定できることがあります。
Natural では、読み取り専用バッファプールをプライマリバッファプールとして実行できます。 このようなバッファプールは変更できません。
読み取り専用バッファプールにないオブジェクトはロードできません。 オブジェクトが読み取り専用のバッファプールにない場合、Natural はエラー
82(オブジェクトが見つからない)を発行します。 これを回避するには、Natural
を実行時にセカンダリ標準バッファプール(読み取り/書き込みアクセス可能)に接続し、そこで不明オブジェクトをアクティブにします。 ダイナミックパラメータ
BPID2
は、セカンダリバッファプールを識別します。
読み取り専用バッファプールの場合を除き、セカンダリバッファプールに接続できるユーザー数には上限があり、セカンダリバッファプールがアクセスされるたびにセマフォを使用したオブジェクトのロックが実行されます。
読み取り専用バッファプールのプリロードリストは、ライブラリ SYSBPM
にあるプログラム
CRTPRL
を使用して、セカンダリ読み取り/書き込みバッファプールの内容を読み取り専用バッファプールのプリロードリストとマージすることによって更新/拡張できます。
読み取り専用バッファプールには、コンフィグレーションユーティリティで代替バッファプールの名前を定義できます(後述の「バッファプールの設定」も参照)。
読み取り専用バッファプールにのみ使用できる、NATBPMON
ユーティリティの
SWAP
コマンドを使用して、読み取り専用バッファプールに "現在使用されていない" というタグを付けることができます。
現在使用されていないバッファプールに接続されたすべての Natural
セッションは、このバッファプールから切断され、代替バッファプールに接続されます。ただしこれは、代替バッファプールも読み取り専用バッファプールの場合に限られます。
Natural が新しいオブジェクトのロードを試行するとき(例えば、CALLNAT
または RETURN
ステートメントの実行時)、または Natural がスタックに配置されたコマンドの解釈を試行するときに、1
つのバッファプールから別のバッファプールへのスワップが実行されます。 現在使用されていないというタグが付けられているバッファプールの IPC
リソース(共有メモリセグメント)は、NATBPMON
ユーティリティの
SWAP
コマンドを発行した後に削除できます。 この機能により、Natural
セッションを中止せずに、バッファおよびその内容を別の読み取り専用バッファプールの更新された内容と交換できます。
Natural バッファプールの使用時に考慮する必要がある最低限の制限は以下のとおりです。
Natural セッションがハングアップしたときに、Windows タスクマネージャを使用して終了しないでください。
このセッションでバッファプール内部データ構造を現在変更している場合は、更新が完全に終了しない段階で割り込みが発生することがあります。 バッファプール内部データ構造に矛盾があると、問題が発生することがあります。
注意:
これは、Natural ニュークリアスがバッファプールルーチンを実行しているときにのみ発生します。
バッファプール割り当ては、ローカルコンフィグレーションファイルに保存されています。 バッファプールを設定するには、コンフィグレーションユーティリティを使用して、ローカルコンフィグレーションファイルに特定の値を指定する必要があります。 これらの値のリストについては、『コンフィグレーションユーティリティ』ドキュメントの「バッファプール割り当て」を参照してください。
Natural は、PC の起動時に Windows サービスの Software AG Natural n.n Buffer Pool Service を使用してバッファプールサーバーを起動します。
Natural のインストール時に、デフォルトバッファプール NATBP
が設定されます。
NATBP
は、Natural
起動時のデフォルトバッファプール名としても使用されます(別のバッファプールを定義するには、プロファイルパラメータ
BPID
を使用します)。
必要に応じて、サービス設定を変更できます。 これについては、以降のトピックを参照してください。
Natural bin ディレクトリに保存されている natbpsvc.exe ファイルは、サービスコマンドを実行するのに使用されます。
次のサービスコマンドは、Windows のコマンドプロンプトウィンドウで指定できます。
この例では、MYBP
という名前の新しいバッファプールを作成し、新しいバッファプールで Natural
を開始する方法について説明します。
独自のバッファプールで Natural を開始するには
コンフィグレーションユーティリティを使用して、ローカルコンフィグレーションファイルに追加のバッファプールを
MYBP
という名前で定義します。
『コンフィグレーションユーティリティ』ドキュメントの「バッファプール割り当て」を参照してください。
注意:
この例では、デフォルトバッファプール NATBP
に定義された値と同じ値を使用できます。
Windows のコマンドプロンプトウィンドウを起動します。
natbpsvc.exe ファイルが保存されている Natural bin ディレクトリに移動します。
次のコマンドを入力して、バッファプールを MYBP
という名前で作成します。
NATBPSVC CREATE MYBP
次の情報が表示されます。
%NATBPSVC-I: Natural n.n Buffer Pool Service %NATBPSVC-I: New buffer pool 'MYBP' created %NATBPSVC-I: Natural n.n Buffer Pool Service
重要:
指定した名前のバッファプールがローカルコンフィグレーションファイルにまだ定義されていない場合は、対応するメッセージが代わりに表示されます。
次の手順に進む前に、ローカルコンフィグレーションファイルにバッファプールを定義してください。
次のコマンドを入力して、サービスの開始時にバッファプールが開始されるように定義します。
NATBPSVC SET MYBP start=yes
次の情報が表示されます。
%NATBPSVC-I: Natural n.n Buffer Pool Service %NATBPSVC-I: Configuration successfully set %NATBPSVC-I: Natural n.n Buffer Pool Service
次のコマンドを入力して、バッファプールを直ちに開始します(サービスを再スタートする必要はありません)。
NATBPSVC START MYBP
次の情報が表示されます。
%NATBPSVC-I: Natural n.n Buffer Pool Service %NATBPSVC-I: Send request to Natural n.n Buffer Pool Service %NATBPSVC-I: Buffer pool 'MYBP' started %NATBPSVC-I: Natural n.n Buffer Pool Service
次のコマンドを入力して、サービス用に現在定義されているすべてのバッファプールのステータスを表示します。
NATBPSVC STATUS
次の情報が表示されます。
%NATBPSVC-I: Natural n.n Buffer Pool Service %NATBPSVC-I: Send request to Natural n.n Buffer Pool Service %NATBPSVC-I: MYBP is active NATBP is active %NATBPSVC-I: Natural n.n Buffer Pool Service
次のようにダイナミックパラメータ
BPID
を使用して、Natural を開始します。
natural BPID=MYBP
バッファプールの作成には、ユーティリティ NATBPSRV
を使用します。
バッファプールサーバーは、Natural バッファプールサービスによって自動的に起動されます。
注意:
ユーティリティ NATBPSRV
を使用すると、他のバッファプールユーザーの作業を破損する可能性があるので、すべての Natural
ユーザーがこのユーティリティにアクセスできるようにはしないでください。
NATBPSRV
は、バッファプールが必要とするリソースを割り当て、バッファプール用の恒久的な通信機能(共有メモリとセマフォ)を作成します。
リソースと機能に必要な指定は、コンフィグレーションユーティリティで行います(「バッファプールの設定」を参照)。
デフォルトでは、バッファプール NATBP
が開始されます。 他のバッファプールを開始するには、次の
NATBPSRV
コマンド行オプションで名前を指定します。
NATBPSRV BP = buffer-pool-name
バッファプールモニタでは、バッファプールの操作中の動作を監視します。 バッファプールモニタは、コンピュータ上で Natural を停止しなければならないときにバッファプールをシャットダウンするのにも使用できます。
バッファプールモニタでは、Natural バッファプールの現在の状態に関する情報が収集されます。
同じコンピュータ上で複数のバッファプールがアクティブになっていて、複数のバッファプールにロードされたオブジェクトが Natural プロセスで変更されると、オブジェクトはその Natural プロセスが接続先されているバッファプールからのみ削除されます。 変更されたオブジェクトが、それが現在ロードされている同じコンピュータ上の他のバッファプールからも削除されるようにするには、コンフィグレーションユーティリティでバッファプールの同期を有効にします。
Natural では、2
つのバージョンのバッファプールモニタを使用できます。グラフィカルユーザーインターフェイスと、コマンド行バージョンの NATBPMON
ユーティリティです。
バッファプールモニタの異なるバージョンの使用方法については、「GUI
バージョンのバッファプールモニタの使用」および「コマンド行バージョンのバッファプールモニタの使用(NATBPMON
)」を参照してください。
このセクションでは、Natural バッファプールの使用時に発生する可能性のある問題とその解決方法について説明します。
以下は、典型的なコマンド出力の例と、実行中に発生した問題に関する説明です。
Natural または Natural バッファプールモニタを起動できない。
以降の例では、Natural 管理者またはユーザーが経験する可能性がある最も一般的な問題について説明します。 これらの問題は、Natural
または NATBPMON
ユーティリティを起動するときにバッファプールが非アクティブな場合に発生します。
Natural を起動しようとすると、次のメッセージが表示されます。
Natural Startup Error 16: Unable to open buffer pool. Buffer pool error: "unexpected system call error occurred" (20) Buffer pool could not attach to the global shared memory.
Natural バッファプールモニタを起動しようとすると、次のメッセージが表示されます。
Cannot get shared memory Buffer pool error: "unexpected system call error occurred" (20) Buffer pool could not attach to the global shared memory.
「Natural バッファプールサービスの使用」の説明に従って、バッファプールサービスを開始します。