6.8.3 Oracle連携時の運用
Oracleと連携する場合のTP1/EEの運用について説明します。
- 〈この項の構成〉
(1) 環境設定(Oracle連携時)
Oracle連携時にTP1/EEで設定する必要がある項目について指定します。
(a) TP1/EEのプロセス関連定義のother_lib_stack_sizeオペランド
プロセス関連定義のother_lib_stack_sizeオペランドで,追加するスタックサイズを指定してください。これは,Oracleライブラリの追加によるトランザクション回復中のスタックサイズ不足を防ぐためです。スタックサイズ不足が発生すると,メモリが破壊されて,プロセスダウンすることがあります。
(b) TP1/EEのトランザクション関連定義のtrnstring定義コマンド
trnstring定義コマンドで次のように指定します。
-
-o "トランザクションサービス用xa_open関数用文字列"
xa_open関数用文字列(オープン文字列)については,Oracleのマニュアルを参照してください。また,TP1/EEはマルチスレッドで動作するため,スレッドを使用できるように指定してください。
オープン文字列に指定するuidには,OracleのDBA_PENDING_TRANSACTIONSビューのSELECT権限があるユーザ名を指定してください。DBA_PENDING_TRANSACTIONSビューのSELECT権限がない場合,UAPの部分回復,およびTP1/EEシステム再開始後のトランザクション回復処理が正常に行われないことがあります。
オープン文字列に指定するSesTmは,Oracleのグローバルトランザクション監視時間値です。SesTmには,TP1/EEのトランザクション処理の監視時間より大きい値を指定してください。SesTmにTP1/EEのトランザクション処理の監視時間より小さい値を指定した場合,SesTmに指定した時間が経過したあと,OracleがTP1/EEの指示を待たないでトランザクションを決着させることがあるため,TP1/EEがプロセスダウンすることがあります。
-
-c "トランザクションサービス用xa_close関数用文字列"
xa_close関数用文字列(クローズ文字列)については,Oracleのマニュアルを参照してください。
-
-O "ユーザサービス用xa_open関数用文字列"
xa_open関数用文字列(オープン文字列)については,Oracleのマニュアルを参照してください。また,TP1/EEはマルチスレッドで動作するため,スレッドを使用できるように指定してください。
オープン文字列に指定するSesTmは,Oracleのグローバルトランザクション監視時間値です。SesTmには,TP1/EEのトランザクション処理の監視時間より大きい値を指定してください。SesTmにTP1/EEのトランザクション処理の監視時間より小さい値を指定した場合,SesTmに指定した時間が経過したあと,OracleがTP1/EEの指示を待たないでトランザクションを決着させることがあるため,TP1/EEがプロセスダウンすることがあります。
また,オープン文字列に指定するLoose_Couplingには,trueを指定してください。Loose_Couplingの指定を省略した場合,およびfalseを指定した場合の動作は保証しません。
なお,DBキュー機能またはオンラインバッチ機能で使用するリソースマネジャがOracleの場合は,次に示すフィールドをオープン文字列に指定してください。
-
Objects=true
DBキュー機能またはオンラインバッチ機能ではLOB型を使用するため,このフィールドを指定する必要があります。指定を省略した場合,動作は保証しません。
-
MaxCur
UAPを実行するために必要なカーソル数に10を加算した値を指定してください。指定値が小さいと,UAPが実行するSQL,DBキュー機能が実行するSQL,またはオンラインバッチ機能が実行するSQLの実行時間が長くなるおそれがあります。
-
-
-C "ユーザサービス用xa_close関数用文字列"
xa_close関数用文字列(クローズ文字列)については,Oracleのマニュアルを参照してください。
-
-r
Oracle RAC機能を使用する場合は,-rオプションを必ず指定してください。-rオプションの指定を省略した場合,トランザクションの決着が不整合になることがあります。また,-rオプションを有効にするために"RAC_FAILOVER=T"をxa_open関数用文字列に指定してください。
Oracle RAC機能を使用する場合でOracle 10g R2以降のときは,-rオプションを指定しないでDTPサービスを使用してください。DTPサービスについては,Oracleのマニュアルを参照してください。
-
-x
1スレッドから一つのOracleインスタンスに対して複数のセションを確立する場合は,-xオプションを必ず指定してください。-xオプションの指定を省略した場合,xa関数がエラーとなることがあります。
- 注意事項
-
trnstring定義コマンドで複数のOracleに接続するように定義した場合で,SQLの実行時にエラーが発生したときは,リソースマネジャとのコネクションの解放指示を行ってください。これは,SQLの実行時にエラーが発生してロールバックを行っても,Oracleの暗黙カーソルがクローズされないことがあるためです。暗黙カーソルがクローズされない状態のまま,以降のトランザクションでSQLを実行するとエラーになることがあります。リソースマネジャとのコネクションの解放の詳細については,マニュアル「TP1/Server Base Enterprise Option プログラム作成の手引」を参照してください。
(c) TP1/Server Baseのユーザサービス定義またはユーザサービスデフォルト定義
Oracleにアクセスするためには,Oracleが定めた環境変数を設定する必要があります。環境変数は,TP1/Server Baseのユーザサービス定義,またはユーザサービスデフォルト定義にputenv形式で指定してください。
次に示すような,設定が必要な環境変数名や設定値については,Oracleのインストール時に設定した値や,環境設定に関して記載されたOracleのマニュアルを参照してください。
-
データ識別子(ORACLE_SID)
-
ORACLEホームディレクトリ(ORACLE_HOME)
(2) リソースマネジャに関する準備(Oracle連携時)
使用できるリソースマネジャの種別や,注意点について説明します。
(a) 使用できるリソースマネジャ
静的リソースマネジャおよび動的リソースマネジャを使用できます。静的リソースマネジャおよび動的リソースマネジャの比較を次の表に示します。
項目 |
動的リソースマネジャ |
静的リソースマネジャ |
---|---|---|
コネクション形態 |
TP1/EE起動時にコネクションを確立し,TP1/EE終了時にコネクションを解放します。 |
|
SQLを発行した場合の動作 |
xa関数を,1リソースマネジャ当たり3〜4回発行します。 |
|
SQLを発行しない場合の動作 |
xa関数を発行しません。 |
xa関数を,1リソースマネジャ当たり3〜4回発行します。 |
(b) UAP作成時のリソースマネジャ連携オブジェクトファイル
eetrnmkobjコマンドを使用して作成します。eetrnmkobjコマンドのオプションに指定する情報については,次の表を参考にしてOracleのXAインタフェースに関して記載されたマニュアルを参照してください。
設定項目 |
対応するOracleのマニュアルでの説明 |
---|---|
リソースマネジャ名 |
xa_switch_tリソース・マネジャ |
リソースマネジャスイッチ名※ |
xa_switch_t構造体 |
リソースマネジャ関連オブジェクト |
ライブラリ |
- 注※
-
DBキュー機能またはオンラインバッチ機能で使用するリソースマネジャがOracleの場合は,静的登録のためのリソースマネジャスイッチ名を指定してください。動的登録のためのリソースマネジャスイッチ名を指定した場合,システムの動作は保証しません。
(c) コネクション数に関する注意点
TP1/EEは,Oracleとの間に複数のコネクションを確立します。そのため,Oracleとの同時接続数が,OracleのSESSIONS定義の指定値を超えないように指定する必要があります。OracleのSESSIONS定義の指定値を超えてOracleにアクセスした場合,xa関数がエラーリターンします。
OracleのSESSIONS定義の指定値は,次に示す計算式(Oracle 10g R2以降の場合)を参考にして見積もってください。
SESSIONS定義の指定値≧((TP1/EEの処理スレッド数+TP1/EEの回復スレッド数+1) ×Oracle用リソースマネジャ数)
-
TP1/EEの処理スレッド数
通常処理スレッド数,予備処理スレッド数,およびタイマ処理スレッド数の合計に1を加えた値です。
-
通常処理スレッド数
TP1/EEのプロセス関連定義のthread_noオペランドで指定します。
-
予備処理スレッド数
TP1/EEのプロセス関連定義のreserve_thread_noオペランドで指定します。
-
タイマ処理スレッド数
TP1/EEのタイマ関連定義のtim_perm_thread_noオペランドで指定します。
tim_perm_thread_noオペランドについては,TP1/FSPの関連ドキュメントを参照してください。
-
-
TP1/EEの回復スレッド数
TP1/EEのプロセス関連定義のrecover_thread_noオペランドで指定します。
-
Oracle用リソースマネジャ数
トランザクション関連定義のtrnstring定義コマンドに指定するOracle用リソースマネジャの数です。
(3) Oracleインスタンスに対する複数のセションの確立
1スレッドから一つのOracleインスタンスに対して複数のセションを確立する場合は,同一グローバルトランザクション内であっても,コネクションごとにトランザクションIDを変更する必要があります。このため,1スレッドから一つのOracleインスタンスに対して複数のセションを確立する場合は,同一グローバルトランザクション内であってもトランザクションIDが一意になるように,トランザクション関連定義のtrnstring定義コマンドに-xを指定してください。
HiRDBおよびOracleに対して複数のセションを確立する場合の処理の例を次の図に示します。図中の"HiRDB_DB_SERVER"はHiRDBのリソースマネジャ名を,"Oracle_XA"はOracleのリソースマネジャ名を示します。
|
図の説明を次に示します。説明文中の番号は図中の番号と対応します。
TP1/EEは,トランザクションの開始時にXIDを作成します(1)。次に,TP1/EEのトランザクション関連定義に従って,次に示すとおりにxa関数を発行します。
-
HiRDBに対するxa関数の発行
(1)で作成したXIDを指定してxa関数を発行します(2,3)。
-
Oracleに対するxa関数の発行
trnstring定義コマンドに-xオプションが指定されているため,(1)で作成したXIDにrmidを付加(XID1_0,XID1_1)してxa関数を発行します(4,5)。
(4) トランザクションの回復待ち合わせ
Oracle RAC機能を使用している場合にOracleサーバが異常終了すると,障害が発生したサーバから切り替え先サーバにインダウトトランザクション(未決着トランザクション情報)が転送されます。このインダウトトランザクションの転送処理に時間が掛かると,Oracleの仕様上,TP1/EEとOracleとの間でトランザクション決着種別が不一致になることがあります。これを防ぐためには,インダウトトランザクションの転送処理を行っている間は,TP1/EEのトランザクションの回復を待ち合わせる必要があります。
Oracle RAC機能を使用している環境で,Oracleサーバに障害が発生したときのトランザクション回復の流れを次の図に示します。
|
図の説明を次に示します。説明文中の番号は図中の番号と対応します。
トランザクション実行中にOracleサーバ(ノード1)で障害が発生した場合(1),未決着トランザクション情報は,切り替え先サーバであるOracleサーバ(ノード2)に転送されます(2,3)。TP1/EEは,(2,3)の転送処理が完了したあとに,xa_recover関数を発行します(4)。xa_recover関数がリターンすると,トランザクションの回復処理が続行されます。
(a) 使用方法
Oracle RAC機能を使用する場合は,トランザクション関連定義のtrnstring定義コマンドに-rオプションを指定してください。trnstring定義コマンドに-rオプションを指定すると,TP1/EEの開始処理中またはオンライン処理中にリソースマネジャから未決着トランザクション情報の通知があるまで,トランザクションの回復処理を待ち合わせます。
回復スレッド数(プロセス関連定義のrecover_thread_noオペランドで指定)は,trnstring定義コマンドの-rオプションに指定したリソースマネジャ数以上にすることをお勧めします。これは,TP1/EEがリソースマネジャからの応答を待ち合わせる際,TP1/EEの回復スレッドが占有されるためです。回復スレッド数を増やさなかった場合は,トランザクションの回復処理に時間が掛かることがあります。
(b) 注意事項
トランザクションの回復処理を待ち合わせた場合,TP1/EEの開始処理中またはオンライン処理中にリソースマネジャに障害が発生すると,そのリソースマネジャが参加したトランザクションの該当リソースマネジャの障害が回復されるまで,トランザクションの回復処理が遅れます。