4.6.2 Oracleとの連携
(1) Oracleの登録
OpenTP1システムにOracleを登録します。OpenTP1システムへのOracleの登録には,trnlnkrmコマンドを使用します。
Oracle Database 11gの場合のtrnlnkrmコマンドの実行例を次に示します。
trnlnkrm -a Oracle_XA -s xaosw -o oraxa11.lib |
trnlnkrmコマンドについては,「7. 運用コマンド」を参照してください。また,trnlnkrmコマンドに指定する「RM名」,「RMスイッチ名」,「RM関連オブジェクト名」などについては,Oracleのマニュアルを参照してください。
trnlnkrmコマンドを実行する場合の注意事項を次に示します。
- trnlnkrmコマンドの-oオプションの指定について
事前に,環境変数LIBに関連オブジェクトのパスを設定しておいてください。また,関連オブジェクト名称をフォルダ付きの絶対パスで指定する場合は,フォルダの区切り文字は「¥¥」としてください。
- prcsvpath定義コマンドの指定について
OpenTP1システムにOracleを登録すると,トランザクションサービスプロセスがOracleのランタイムライブラリを使用します。このため,プロセスサービス定義のprcsvpath定義コマンドで,Oracleのランタイムライブラリの格納フォルダを指定してください。prcsvpath定義コマンドの定義例を次に示します。
(2) 環境変数の設定
Oracleにアクセスするために,Oracleの環境変数に値を設定します。環境変数は,次に示すOpenTP1のシステム定義にputenv形式で設定します。
- トランザクションサービス定義
- ユーザサービス定義
- ユーザサービスデフォルト定義
これらの定義例を次に示します。
putenv ORACLE_HOME c:¥orant
putenv ORACLE_SID ORCL |
OpenTP1のシステム定義については,「5. システム定義」を参照してください。設定が必要な環境変数名や設定値などについては,Oracleのインストール時の設定値や,Oracleのマニュアルを参照してください。
(3) トランザクションサービス定義の設定
トランザクションサービス定義のtrnstring定義コマンドで,リソースマネジャにアクセスするための情報を指定します。Oracleと連携する場合は,trnstring定義コマンドの-nオプション,-oオプション,-Oオプション,および必要に応じて-dオプションを指定してください。
-oオプション,および-Oオプションには,リソースマネジャへのアクセスに使用するxa_open関数用文字列を指定します。なお,xa_close関数用文字列(trnstring定義コマンドの-cオプション,および-Cオプションで指定)については,指定する必要はありません。
-oオプションで指定するトランザクションサービス用xa_open関数用文字列のuidには,OracleのDB管理者を指定してください。指定したuidがOracleのDB管理者でなかった場合,またはDBA権限を持っていない場合には,UAPの部分回復,およびOpenTP1システム再開始後のトランザクション回復処理が正常に行われないことがあります。Oracleのxa_open関数用文字列として指定する内容の詳細については,Oracleのマニュアルを参照してください。
トランザクションサービス定義の定義例を次に示します。
trnstring -n Oracle_XA ¥
-o "Oracle_XA+Acc=P/sys/change_on_install+SesTm=60" ¥
-O "Oracle_XA+Acc=P/scott/tiger+SesTm=60" |
- 注
- ""で囲んだ文字列を継続行マーク(¥)で区切って改行する場合は,次の行は必ず第1カラム目から記述し,スペースを開けないで文字列を続けてください。
- 注意
- X/OpenのXAインタフェースを使用してOpenTP1からOracleにアクセスする場合に発生する障害の多くは,xa_open関数用文字列の定義誤りによって発生します。KFCA00901-Wメッセージが出力された場合には,xa_open関数用文字列の定義を見直してください。
(4) 複数のOracleにアクセスする場合の設定
OpenTP1から複数のOracleにアクセスする場合の設定について説明します。なお,複数のOracleのuidで一つのOracleにアクセスする場合も,複数のOracleにアクセスする場合と同様の設定をしてください。
- SQL*Netのセットアップ
OpenTP1から複数のOracleにアクセスする場合には,Oracleのオープン,クローズ文字列指定の仕様によって,SQL*Netが必要となります。Oracleのマニュアルを参照して,SQL*Netのセットアップを行ってください。
- xa_open関数用文字列の定義
OpenTP1から複数のOracleにアクセスする場合には,リソースマネジャへのアクセスに使用するxa_open関数用文字列の定義方法が異なります。定義方法を次に示します。
- トランザクションサービス定義のtrnstring定義コマンドの-iオプションを定義して,「リソースマネジャ名称+リソースマネジャ拡張子」によって,複数のOracleを識別できるようにします。
- 1.で定義したリソースマネジャ拡張子を,ユーザサービス定義,またはユーザサービスデフォルト定義のtrnrmid定義コマンドの-iオプションで定義します。
トランザクションサービス定義の定義例を次に示します。
trnstring -n Oracle_XA -i s1 ¥
-o "Oracle_XA+Acc=P/sys/change_on_install+SesTm=60" ¥
-O "Oracle_XA+Acc=P/scott/tiger+SesTm=60"
trnstring -n Oracle_XA -i s2 ¥
-o "Oracle_XA+SqlNet=host01+Acc=P/sys/change_on_install+SesTm=60"¥
-O "Oracle_XA+SqlNet=host01+Acc=P/scott/tiger+SesTm=60" |
ユーザサービスデフォルト定義の定義例を次に示します。
trnrmid -n Oracle_XA -i s1 |
ユーザサービス定義の定義例を次に示します。
trnrmid -n Oracle_XA -i s2 |
- 注
- trnrmid定義コマンドは,リソースマネジャ拡張子ごとに独立して定義が有効になります。したがって,ユーザサービスデフォルト定義にs1を,ユーザサービス定義にs2を指定した場合,ユーザサービス定義ではs1とs2の両方が有効になっています。
(5) UAPの翻訳と結合
OracleにアクセスするUAPを翻訳(コンパイル)および結合(リンケージ)する場合,trnmkobjコマンドで%DCDIR%¥spool¥trnrmcmd¥userobj下に作成したトランザクション制御用オブジェクトをリンケージする必要があります。
コンパイルとリンケージの手順については,「3.2 UAPの翻訳と結合」,マニュアル「OpenTP1 プログラム作成リファレンス」の該当する言語編,およびOracleのマニュアルを参照してください。trnmkobjコマンドについては,「7. 運用コマンド」を参照してください。
OracleにアクセスするUAP用トランザクション制御用オブジェクトの作成例を,C言語の場合とCOBOL言語の場合に分けて次に示します。
C言語の場合
trnmkobj -o rm_obj -r Oracle_XA |
COBOL言語の場合
trnmkobj -o rm_obj -C "/Zl" -r Oracle_XA |
(6) メイクファイルの例(C言語の場合)
C言語でSPPを作成する場合のメイクファイルの例を示します。
(a) ソースファイル名
メイクファイルの例中で使用するソースファイル名を次に示します。
- C言語で作成したUAPのソースプログラム名:
- exmain.c(メイン関数)
- exsv1.c(サービス関数1)
- exsv2.c(サービス関数2)
- exproc.pc(pcファイル)
- RPCインタフェース定義ファイル名:ex.def
(b) メイクファイルの例
メイクファイルの例を次に示します。
NODEBUG = 1
!include <ntwin32.mak>
#TP1TEST Make File
SYSLIB = $(conlibsdll)
TP1LIB = [libdam.lib]※1 [libtam.lib]※2 libbetran.lib
ORACLELIB = oraxa11.lib
all:TP1TEST.exe
#コンパイル
exmain.obj:exmain.c
$(cc) $(cflags) $(cvarsdll) $*.c
exsv1.obj:exsv1.c
$(cc) $(cflags) $(cvarsdll) $*.c
exsv2.obj:exsv2.c
$(cc) $(cflags) $(cvarsdll) $*.c
ex_sstb.obj:ex_sstb.c
$(cc) $(cflags) $(cvarsdll) $*.c
exproc.obj:exproc.c
$(cc) $(cflags) $(cvarsdll) $*.c
#スタブソースファイルの作成
ex_sstb.c:ex.def
$(DCDIR)¥bin¥stbmake $?
#プリコンパイルの実行
exproc.c:exproc.pc
$(ORACLE_HOME)¥bin¥proc release_cursor=yes $?
#リンケージ
TP1TEST.exe: exmain.obj exsv1.obj exsv2.obj ex_sstb.obj exproc.obj
$(link) $(conflags) -out:$*.exe $** ¥
[$(DCDIR)¥spool¥trnrmcmd¥userobj¥rm_obj.obj ¥]※3
$(TP1LIB) $(SYSLIB) $(ORACLELIB) |
- 注※1
- libdam.libは,TP1/FS/Direct Accessを使用する場合だけ指定してください。
- 注※2
- libtam.libは,TP1/FS/Table Accessを使用する場合だけ指定してください。
- 注※3
- TP1/FS/Direct AccessまたはTP1/FS/Table Accessを使用する場合には,trnmkobjコマンドでトランザクション制御用オブジェクトを作成するときに,「OpenTP1_DAM」または「OpenTP1_TAM」を追加してください。
(7) メイクファイルの例(COBOL言語の場合)
COBOL言語でSPPを作成する場合のメイクファイルの例を示します。
(a) ソースファイル名
メイクファイルの例中で使用するソースファイル名を次に示します。
- COBOL2002で作成したUAPのソースプログラム名:main.cbl
- COBOL2002で作成したUAPのサービスプログラム名:sev1.cbl
- COBOL2002で作成したUAPのサービスプログラム名:sev2.cbl
- pcoファイル名1:exprocb1.pco
- pcoファイル名2:exprocb2.pco
- RPCインタフェース定義ファイル名:ex.def
(b) メイクファイルの例
メイクファイルの例を次に示します。
!include <ntwin32.mak>
#TP1TEST Make File
CBLFG1 = -Compile,NoLink -Comp5 -Lib,CUI -SQL,ODBC -Main,System
CBLFG2 = -Compile,NoLink -Comp5 -Lib,CUI -SQL,ODBC
SYSLIB = $(conlibsdll)
TP1LIB = [libdam.lib]※1 [libtam.lib]※2 libbetran.lib
ORACLELIB = oraxa11.lib
CCBL = ccbl2002
LK = ccbl2002 -Lib,CUI
all:TP1TEST.exe
#コンパイル
main.obj:main.cbl
$(CCBL) $(CBLFG1) main.cbl
sev1.obj:sev1.cbl
$(CCBL) $(CBLFG2) sev1.cbl
sev2.obj:sev2.cbl
$(CCBL) $(CBLFG2) sev2.cbl
exprocb1.obj:exprocb1.cbl
$(CCBL) $(CBLFG2) exprocb1.cbl
exprocb2.obj:exprocb2.cbl
$(CCBL) $(CBLFG2) exprocb2.cbl
ex_sstb.obj:ex_sstb.c
$(cc) $(cflags) /Zl $(cvarsdll) $*.c
#スタブソースファイルの作成
ex_sstb.c:ex.def
$(DCDIR)¥bin¥stbmake $?
#プリコンパイルの実行
exprocb1.cbl:exprocb1.pco
$(ORACLE_HOME)¥bin¥procob release_cursor=yes $?
exprocb2.cbl:exprocb2.pco
$(ORACLE_HOME)¥bin¥procob release_cursor=yes $?
#リンケージ
TP1TEST.exe: main.obj sev1.obj sev2.obj ex_sstb.obj ¥
exprocb1.obj exprocb2.obj
$(LK) -OutputFile $*.exe $** ¥
[$(DCDIR)¥spool¥trnrmcmd¥userobj¥rm_obj.obj ¥]※3
$(TP1LIB) $(SYSLIB) $(ORACLELIB) |
- 注※1
- libdam.libは,TP1/FS/Direct Accessを使用する場合だけ指定してください。
- 注※2
- libtam.libは,TP1/FS/Table Accessを使用する場合だけ指定してください。
- 注※3
- TP1/FS/Direct AccessまたはTP1/FS/Table Accessを使用する場合には,trnmkobjコマンドでトランザクション制御用オブジェクトを作成するときに,「OpenTP1_DAM」または「OpenTP1_TAM」を追加してください。
(8) Oracleとの連携時の注意事項
- OpenTP1とOracleをX/OpenのXAインタフェースで連携する場合,Oracleの関連サービスがすべて起動されていることを確認してください。
- OpenTP1とOracleをX/OpenのXAインタフェースで連携する場合,トランザクションの開始,および同期点取得は,次に示すOpenTP1の関数を使用してください。
dc_trn_begin,tx_begin,dc_trn_unchained_commit,dc_trn_chained_commit,tx_commit,dc_trn_unchained_rollback,dc_trn_chained_rollback,tx_rollback
OracleのSQL言語などでコミットやロールバックをした場合,またはOracleがXAインタフェースで連携する場合に使用できない機能を使用すると,トランザクション処理が正常に実行されないで,リソース間の不整合が発生したり,OpenTP1システムがダウンしたりすることがあります。
- Oracleのトラブルシュート情報格納フォルダには,OpenTP1のサービスログオンアカウントのユーザが書き込みできるアクセス権を設定してください。書き込み権限がない場合,OpenTP1のサーバプロセスで発行したXA関数のトラブルシュート情報を格納できないことがあります。
- OpenTP1とOracleをX/OpenのXAインタフェースで連携する場合,次のメッセージが出力されるときは,Oracleや通信プロセスなどが起動されているかを確認してください。
- トランザクション中にOracleの通信プロセス(SQL*Net機能の一部)が未起動の場合や障害が発生した場合に,KFCA00901-Wメッセージが出力される。
- SQLのアクセスでOracleのORA-1012メッセージが出力される。
- OpenTP1とOracleをX/OpenのXAインタフェースで連携する場合,OracleをXAインタフェースでアクセスするプロセス数が,Oracleの"SESSIONS"定義の指定値を超えたときにも,KFCA00901-Wメッセージが出力されます。その場合は,次に示す計算式を参考にして,Oracleの"SESSIONS"定義を見直してください。
"SESSIONS"定義の最小値 ≧ Oracleアクセス基礎値 × n※1
Oracleアクセス基礎値
≧((Oracleをアクセスするユーザサーバプロセスの総数
+ 並行回復プロセス数※2 + 1※3 )
× Oracleの数) |
- 注※1
- nは,「xa_open→xa_start→UOC(SQL)→xa_end→xa_close」までの処理で必要なセション数(通常は1~5程度)です。詳細については,Oracleの設定を確認してください。
- 注※2
- 並行回復プロセス数は,トランザクションサービス定義のtrn_recovery_process_countオペランドの指定値です。
- 注※3
- 1は,OpenTP1のリソースマネジャ監視プロセスの数です。
- OpenTP1とOracleをX/OpenのXAインタフェースで連携する場合,Oracleのオープン文字列に指定する「SesTm」は,Oracleのグローバルトランザクション監視時間です。「SesTm」に小さい値を指定した場合,指定した時間が経過すると,OracleがOpenTP1の指示を待たずにトランザクションを決着させることがあるため,ユーザサーバやOpenTP1システムがダウンすることがあります。「SesTm」には,余裕を持たせた値を指定してください。
- OpenTP1とOracleをX/OpenのXAインタフェースで連携する場合,トランザクション実行中にOracleがダウンして再起動したときに,Oracleのダウン前にアクセスしていたプロセスからの要求を,Oracleが受け付けなくなることがあります。その場合は,KFCA00901-W,KFCA00905-E,またはKFCA00906-Eメッセージが出力されるため,該当するサーバを終了させて,再起動してください。該当するサーバが「_trnrcv」の場合は,OpenTP1システムを終了させて,再起動してください。