3.4.1 OpenTP1との関連(XAインタフェースを使用する場合)
X/Openに準拠したAPIを使用して,OLTP環境でリソースマネジャとしてXDM/RD E2を使用できます。
このとき,OLTPシステムはXDM/RD E2をHiRDBサーバとみなして動作します。したがって,HiRDBの関連マニュアルをお読みになる場合は,「HiRDB」を「XDM/RD E2」に置き換えてお読みください。
- 〈この項の構成〉
-
(1) 必要となるプログラムプロダクトのバージョン
X/Openに準拠したAPIを使用して,XDM/RD E2に接続する場合に必要なVOS3のプログラムプロダクトのバージョンを次に示します。
-
XDM/RD E2:06-03以降
-
DBコネクションサーバ:03-02以降
上記のプログラムプロダクトに関連するプログラムプロダクトのバージョンについては,上記プログラムプロダクトのマニュアルを参照してください。
(2) VOS3のプログラムプロダクトの定義
X/Openに準拠したAPIを使用して,XDM/RD E2に接続する場合に必要なVOS3のプログラムプロダクトの定義を次に示します。詳細については,各プログラムプロダクトのマニュアルを参照してください。
(a) XDM/RD E2
OLTPシステムがOpenTP1の場合,XDM/RD E2に接続できるユーザ数を一つ多く定義します。
(b) DBコネクションサーバ
-
二相コミット機能を使用する定義。
-
OLTPシステムがOpenTP1の場合,DBコネクションサーバに接続できるTCPコネクション数を一つ多く定義します。
(3) UAP作成上の留意事項
(a) SQL関連の注意事項
- 使用できないSQL
-
X/Openに準拠したAPIを使用しているUAPからは,次に示すSQLは使用できません。
-
定義系SQL
-
PURGE TABLE文
-
COMMIT文
-
CONNECT文
-
DISCONNECT文
-
ROLLBACK文
-
- 暗黙的ロールバック
-
X/Openに準拠したAPIを使用している場合,SQL実行時にXDM/RD E2で暗黙的ロールバック要因が発生すると,XDM/RD E2は自動的にロールバックします。
このため,暗黙的ロールバック要因が発生した場合は,XDM/RD E2以外の資源に対する整合性を保つために,速やかにトランザクションのロールバック※をする必要があります。
暗黙的ロールバック要因が発生すると,XDM/RD E2はロールバック以外の要求を実行できなくなります。
XDM/RD E2で暗黙的ロールバック要因が発生したかどうかは,SQL連絡領域(SQLCA)のSQLWARN6を参照して判断してください。暗黙的ロールバック要因が発生している場合,'W'が設定されています。なお,暗黙的ロールバック要因が発生した場合は,SQLCODEは負の値となります。
- 注※
-
ここで説明しているロールバックとは,トランザクションマネジャが用意するロールバック関数などの発行を示すものであり,SQLのROLLBACK文ではありません。
(4) HiRDB XAライブラリ
X/Open XAインタフェースとは,分散トランザクション処理(DTP:Distributed Transaction Processing)システムのトランザクションマネジャ(TM:Transaction Manager)とリソースマネジャ(RM:Resource Manager)の接続インタフェースを規定したX/Openの標準仕様です。X/Open XAインタフェースを使用すると,リソースマネジャのトランザクション処理をトランザクションマネジャで制御できます。リソースマネジャのトランザクション処理をトランザクションマネジャで制御するには,リソースマネジャが提供するライブラリとトランザクションマネジャが提供するライブラリをUAPにリンケージします。
XDM/RD E2のUAPの処理をトランザクションマネジャで制御するために,HiRDBはHiRDB XAライブラリを提供しています※。HiRDB XAライブラリは,X/Open DTPソフトウェア・アーキテクチャのXAインタフェースの仕様に準拠しています。
- 注※
-
XDM/RD E2に接続する場合も,HiRDBサーバに接続する場合と同じHiRDB XAライブラリを使用します。
X/Open DTPモデルでのXDM/RD E2の位置づけを次の図に示します。
|
(5) HiRDB XAライブラリでサポートする機能
HiRDB XAライブラリでサポートする機能を次の表に示します。
ただし,XDM/RD E2をサーバとして使用する場合とHiRDBサーバを使用する場合では,サポートする機能が異なります。
機能 |
説明 |
サポート有無 |
|
---|---|---|---|
HiRDB サーバ |
XDM/RD E2 サーバ |
||
トランザクションのコミット処理を,UAPがHiRDBにアクセスしたときと異なるサーバプロセスで実行する機能です。ここでいうUAPとは,HiRDB XAライブラリを使用してHiRDBに接続するUAPのことです。 |
○ |
×※ |
|
二相コミット制御を一相に最適化する機能です。 |
○ |
○ |
|
プリペア要求でHiRDBのリソースが更新されていない場合,トランザクションマネジャが二相目にコミット要求をしないで最適化する機能です。 |
○ |
○ |
|
UAPを実行する直前に,HiRDBが動的にトランザクションを登録する機能です。 |
○ |
○ |
|
トランザクションマネジャが非同期にHiRDB XAライブラリを呼び出す機能です。 |
× |
× |
|
一つのUAPからXDM/RD E2に対して複数のCONNECTを別々に実行する機能です。 X/Open XAインタフェース環境下での複数接続機能については,マニュアル「HiRDB Version 9 UAP開発ガイド」を参照してください。 |
○ |
○ |
- (凡例)
-
○:HiRDB XAライブラリでサポートしています。
×:HiRDB XAライブラリでサポートしていません。
- 注※
-
トランザクションの移行は使用できません。このため,HiRDBクライアント環境変数のPDXAMODEオペランドには0を指定するか,PDXAMODEオペランドの指定を省略してください。
(6) システムの構成例
OLTPシステムを使用したシステムの構成例を次の図に示します。
|
(7) トランザクションの移行
トランザクションの移行は,XDM/RD E2に接続する場合には使用できません。
このため,HiRDBクライアント環境変数のPDXAMODEオペランドには0を指定するか,PDXAMODEオペランドの指定を省略してください。
(a) トランザクションマネジャがOpenTP1の場合
XDM/RD E2に接続する場合は,トランザクションの移行が使用できないため,OpenTP1のコミット最適化およびプリペア最適化は使用できません。
ただし,OpenTP1システムの状態によっては,トランザクションの移行を使用しなくても,コミット最適化およびプリペア最適化を使用する指定(OpenTP1システム定義のトランザクションサービス定義のtrnstringオペランドに-dオプションを省略)ができます。
OpenTP1システム定義のトランザクションサービス定義のtrnstringオペランドの指定とOpenTP1システムの状態の組み合わせ可否を次に示します。
条件 |
組み合わせ可否 |
||
---|---|---|---|
trnstringオペランドの指定 |
OpenTP1システムの状態 |
||
-dオプションを省略 |
同一OpenTP1システム内では一つのAPだけでグローバルトランザクションを構成している場合 |
可能 |
|
同一OpenTP1システム内では複数のAPでグローバルトランザクションを構成している場合 |
一つのAPだけがHiRDB XAライブラリとリンクしているとき |
可能 |
|
複数のAPがHiRDB XAライブラリとリンクしているとき |
不可能※ |
||
-dオプションを指定 |
該当しない |
可能 |
- 注
-
-dオプションは,TP1/Server Baseのバージョンが03-03以降のときに指定できます。
- 注※
-
同一OpenTP1システム内では複数のAPでグローバルトランザクションを構成しており,かつ複数のAPがHiRDB XAライブラリとリンクしている場合は,trnstringオペランドに必ず-dオプションを指定してください。
trnstringオペランドについては,マニュアル「OpenTP1 Version 7 分散トランザクション処理機能 OpenTP1 システム定義」を参照してください。
コミット最適化およびプリペア最適化については,マニュアル「OpenTP1 Version 7 分散トランザクション処理機能 OpenTP1 プログラム作成の手引」を参照してください。
(8) トランザクションマネジャへの登録
OLTPと連携するには,XDM/RD E2をトランザクションマネジャに登録する必要があります。XDM/RD E2をトランザクションマネジャに登録するには,OpenTP1のtrnlnkrmコマンドを使用します。
XDM/RD E2をトランザクションマネジャに登録するときには,次に示すどちらかの方法を選択してください。
-
動的登録方法
-
静的登録方法
なお,一つのトランザクションマネジャに対して,動的登録方法と静的登録方法を混在して使用できません。
(a) 動的登録方法とは
XDM/RD E2をトランザクションマネジャに動的登録すると,トランザクション内で最初のSQL文を発行したときに,UAPがトランザクションマネジャの制御下に入ります。UAPがXDM/RD E2を含む複数のリソースマネジャをアクセスする場合,またはUAPがXDM/RD E2をアクセスするとは限らない場合などに,トランザクションマネジャからのXDM/RD E2に対するトランザクション制御のオーバヘッドを削減できます。
(b) 静的登録方法とは
XDM/RD E2をトランザクションマネジャに静的登録すると,UAPがSQL文の発行に関係なく,トランザクションの開始時に常にトランザクションマネジャの制御下に入ります。
トランザクションマネジャがOpenTP1の場合,UAPとXDM/RD E2とのコネクションが切断されたとき(ユニットの異常終了またはサーバプロセスの異常終了などのとき)に,OpenTP1にはトランザクション開始時に再接続をする機能があるため,UAPの再起動が不要になります。
(c) 動的登録方法と静的登録方法の違い
動的登録方法と静的登録方法の違いを次の表に示します。
差異のポイント |
動的登録方法 |
静的登録方法 |
---|---|---|
トランザクション開始時 |
管理しない |
|
トランザクション内で最初のSQL発行時 |
|
|
トランザクション処理中のトランザクションマネジャとXDM/RD E2間の通信回数 |
SQL文数+コミット処理通信回数 |
SQL文数+コミット処理通信回数+1(トランザクション開始処理用の通信分) |
トランザクションマネジャとXDM/RD E2間のコネクションが,途中で切断したときの再接続方法※1 |
次回のトランザクション開始時に自動的に再接続※2 |
次回のトランザクション開始時に自動的に再接続※3 |
- 注※1
-
トランザクションマネジャがOpenTP1のときに限ります。
- 注※2
-
OpenTP1のtrn_rm_open_close_scopeオペランドにtransactionを指定している場合に自動的に再接続します。指定していない場合は,UAPをいったん終了させ,再起動する必要があります。
ただし,UAPがtx_openを再発行すれば,UAPを再起動しなくてもコネクションを再接続できます。詳細については,「トランザクションマネジャとXDM/RD E2間のコネクションが切断されたときの再接続方法」を参照してください。
- 注※3
-
UAPがtx_openを再発行すれば,UAPを再起動しなくてもコネクションを再接続できます。詳細については,「トランザクションマネジャとXDM/RD E2間のコネクションが切断されたときの再接続方法」を参照してください。
(9) トランザクションマネジャに登録する情報
XDM/RD E2をリソースマネジャとしてトランザクションマネジャに登録する方法については,トランザクションマネジャのマニュアルを参照してください。このとき,次に示す情報をトランザクションマネジャに指定します。
(a) RMスイッチ名
動的登録方法にするか静的登録方法にするかは,RMスイッチ名の指定で決まります。XDM/RD E2のRMスイッチ名(xa_switch_t 構造体名)を次に示します。
-
動的登録方法の場合:pdtxa_switch
-
静的登録方法の場合:pdtxa_switch_y
(c) オープン文字列
トランザクションマネジャがxa_openでリソースマネジャをオープンするときに使用するオープン文字列は,複数接続機能を使用する場合に指定してください。複数接続機能を使用しない場合はオープン文字列を指定する必要はありません。
複数接続機能を使用する場合は,トランザクションマネジャに複数のXDM/RD E2を登録し,各XDM/RD E2に対してオープン文字列を指定します。オープン文字列には次に示す項目を指定します。
-
接続先で有効にする環境変数を設定したファイルの絶対パス名(OSがUNIXの場合)
-
接続先で有効にする環境変数をレジストリ登録したときに指定した環境変数グループ名(OSがWindowsの場合)
-
環境変数グループ識別子
OSがUNIXの場合は,"環境変数グループ識別子+環境変数設定ファイル名"または"環境変数グループ識別子*環境変数設定ファイル名"の形式で指定します。
OSがWindowsの場合は,"環境変数グループ識別子+環境変数グループ名"または"環境変数グループ識別子*環境変数グループ名"の形式で指定します。
これ以外の形式で指定した場合は,オープン文字列が無視されます。
また,環境変数グループ識別子は4バイト固定,オープン文字列は全体で257バイト以下で指定してください。
トランザクションマネジャがOpenTP1の場合のオープン文字列の登録例を次に示します。
- トランザクションマネジャがOpenTP1の場合のオープン文字列の登録例
-
OpenTP1のトランザクションサービス定義のtrnstringオペランドでオープン文字列を登録します。ここでは二つのXDM/RD E2をOpenTP1に登録します。登録条件は次のとおりとします。
-
OSがUNIXの場合
リソースマネジャ
環境変数グループ識別子
環境変数設定ファイル名
XDMRD1
XRD1
/usr/conf/XDMRD/XDMRD11.ini
/usr/conf/XDMRD/XDMRD12.ini
XDMRD2
XRD2
/usr/conf/XDMRD/XDMRD21.ini
/usr/conf/XDMRD/XDMRD22.ini
-
OSがWindowsの場合
リソースマネジャ
環境変数グループ識別子
環境変数グループ名
XDMRD1
XRD1
xdmrd11
xdmrd12
XDMRD2
XRD2
xdmrd21
xdmrd22
オープン文字列の登録例を次に示します。
-
OSがUNIXの場合
trnstring -n HiRDB_DB_SERVER -i X1 -o "XRD1*/usr/conf/XDMRD/XDMRD11.ini" -O "XRD1+/usr/conf/XDMRD/XDMRD12.ini" trnstring -n HiRDB_DB_SERVER -i X2 -o "XRD2*/usr/conf/XDMRD/XDMRD21.ini" -O "XRD2+/usr/conf/XDMRD/XDMRD22.ini"
-
OSがWindowsの場合
trnstring -n HiRDB_DB_SERVER -i X1 -o "XRD1*xdmrd11" -O "XRD1+xdmrd12" trnstring -n HiRDB_DB_SERVER -i X2 -o "XRD2*xdmrd21" -O "XRD2+xdmrd22"
説明
-n:リソースマネジャ名を指定します。
-i:リソースマネジャ拡張子を指定します。
- -o:トランザクションサービス用xa_open関数用文字列を指定します。
-
OpenTP1のトランザクションサービスプロセスが使用するオープン文字列を指定します。OSがUNIXの場合は"環境変数グループ識別子*環境変数設定ファイル名",OSがWindowsの場合は"環境変数グループ識別子*環境変数グループ名"の形式で指定します。
- -O:ユーザサーバ用xa_open関数用文字列を指定します。
-
ユーザサーバプロセスが使用するオープン文字列を指定します。OSがUNIXの場合は"環境変数グループ識別子+環境変数設定ファイル名",OSがWindowsの場合は"環境変数グループ識別子+環境変数グループ名"の形式で指定します。
-
-oと-Oには同じ環境変数グループ識別子を指定してください。
-
-oと-Oに指定するファイルレジストリで設定する環境変数は同じ内容にしてください。
- 備考
-
OpenTP1のユーザサービス定義のtrnrmidオペランドで,ユーザサービスから接続するXDM/RD E2を選択します。XDMRD1とXDMRD2に接続する例を次に示します。
trnrmid -n HiRDB_DB_SERVER -i X1,X2
-
(e) RM関連オブジェクト名
RM関連オブジェクト名には,次に示すライブラリ名を指定します。
- (i)OSがUNIXの場合
-
ライブラリの種類
ライブラリ名
共用ライブラリ
シングルスレッド用
libzclty.sl(libzcltx.sl)
シングルスレッド用
(複数接続機能対応)
libzcltys.sl(libzcltxs.sl)
アーカイブ
ライブラリ
シングルスレッド用
libcltya.a(libcltxa.a)
- 注1
-
動的登録する場合は,( )で囲まれているライブラリ名を指定してもかまいません。
- 注2
-
ライブラリには共用ライブラリとアーカイブライブラリの両方があります。用途に応じてどちらかを選択してください。ただし,次に示す利点があるため,共用ライブラリを指定することをお勧めします。
-
UAPのオブジェクトサイズが小さくなります。
-
HiRDBのバージョンアップ時に再リンケージが不要になります。
-
- 注3
-
共用ライブラリのサフィックスは,プラットフォームによって異なります。Linuxの場合は.so,AIXの場合は.aとなります。
- (ii)OSがWindowsの場合
-
ライブラリの種類
ライブラリ名
シングルスレッド用
pdcltx32.lib
シングルスレッド用(複数接続機能対応)
pdcltxs.lib
(f) クライアント環境定義
トランザクションマネジャにXDM/RD E2のトランザクション処理を制御させるためには,HiRDBのクライアント環境定義をトランザクションマネジャの定義に設定する必要があります。OLTP環境下でのクライアント環境定義の設定方法については,マニュアル「HiRDB Version 9 UAP開発ガイド」を参照してください。
トランザクションマネジャがOpenTP1の場合,クライアント環境定義のファイル名を次に示すOpenTP1のシステム定義に,putenv形式で定義する必要があります。
-
HiRDBクライアント環境定義
-
システム環境定義
-
ユーザサービスデフォルト定義
-
ユーザサービス定義
-
トランザクションサービス定義
システム環境定義,ユーザサービスデフォルト定義,ユーザサービス定義,およびトランザクションサービス定義については,マニュアル「OpenTP1 Version 7 分散トランザクション処理機能 OpenTP1 システム定義」を参照してください。
なお,複数のOpenTP1と接続する場合は,HiRDBクライアント環境定義HiRDB_PDTMID,またはPDTMIDを必ず指定してください。
(10) トランザクションマネジャへの登録例
XDM/RD E2をOpenTP1に登録するには,OpenTP1のtrnlnkrmコマンドを使用します。trnlnkrmコマンドの指定例を次に示します。
- 動的登録方法の場合
-
-
OSがUNIXの場合
trnlnkrm -a HiRDB_DB_SERVER -s pdtxa_switch -o /HiRDB/client/lib/libzcltx.sl
-
OSがWindowsの場合
trnlnkrm -a HiRDB_DB_SERVER -s pdtxa_switch -o C:\win32app\hitachi\hirdb_s\client\lib\pdcltx32.lib
説明
-a:RM名を指定します。
-s:RMスイッチ名を指定します。RMスイッチ名は,登録方法(動的登録方法または静的登録方法)によって異なります。
-o:RM関連オブジェクト名(共用ライブラリのファイル名)を指定します。
-
- 静的登録方法の場合
-
-
OSがUNIXの場合
trnlnkrm -a HiRDB_DB_SERVER -s pdtxa_switch_y -o /HiRDB/client/lib/libzclty.sl
-
OSがWindowsの場合
trnlnkrm -a HiRDB_DB_SERVER -s pdtxa_switch_y -o C:\win32app\hitachi\hirdb_s\client\lib\pdcltx32.lib
説明
-a:RM名を指定します。
-s:RMスイッチ名を指定します。RMスイッチ名は,登録方法(動的登録方法または静的登録方法)によって異なります。
-o:RM関連オブジェクト名(共用ライブラリのファイル名)を指定します。
-
(11) トランザクションマネジャへの登録の変更
トランザクションマネジャへの登録を変更する場合には,次に示す手順に従ってトランザクションマネジャにXDM/RD E2を登録し直してください。
-
OpenTP1のtrnlnkrmコマンドで,トランザクションマネジャにXDM/RD E2を登録し直します。
-
OpenTP1のtrnmkobjコマンドで,トランザクション制御用オブジェクトファイルを再作成します。
-
2.で再作成したトランザクション制御用オブジェクトファイルおよび「トランザクションマネジャに登録する情報」に示した情報を基に,HiRDBのXAライブラリとリンクしていたすべてのUAPを再リンケージしてください。再リンケージをしないと,UAPの動作は保証されません。
(12) トランザクションマネジャとXDM/RD E2間のコネクションが切断されたときの再接続方法
(a) UAPで対処する方法
コネクションが切断された場合,実行中のUAPを再起動してください。再起動すると,自動的にコネクションが再接続されます。
UAPを再起動したくない場合は,コネクションが切断されたことを示すエラーがUAPに返ったときに,tx_open関数を再発行してください。tx_open関数を再発行することで,UAPを終了しなくても,サービスを続行できます。tx_open関数を再発行するときのコーディング例を次に示します。
- コーディング例
int connection = 1; void service(char *in_data,long *in_len,char *out_data,long *out_len) { if (connection == 0) { tx_close(); tx_open(); ……………コネクション切断時のtx_open再発行処理 } tx_begin(); EXEC SQL INSERT INTO ......; ……………SQL文発行 if (SQLCODE == 0) { tx_commit(); *out_data = "OK"; } else { tx_rollback(); *out_data = "NG"; if (SQLCODE == -563 || SQLCODE == -722) { connection = 0; ……………コネクション切断を記憶 } } }
(b) OpenTP1の機能を使用する方法
動的登録方法の場合は,OpenTP1のトランザクションサービス定義またはユーザサービス定義のtrn_rm_open_close_scopeオペランドにtransactionを指定してください。transactionを指定することで,OpenTP1はトランザクションの開始または終了でXDM/RD E2とのコネクションを確立または切断します。したがって,途中でコネクションが切断されても,次回のトランザクションの開始時にコネクションが再接続されます。
静的登録方法の場合は,トランザクションの開始時にXDM/RD E2とのコネクションが確立されているかどうかをトランザクションマネジャが確認します。コネクションが切断されている場合は,自動的に再接続されて,トランザクションを開始します。