スケーラブルデータベースサーバ HiRDB Version 8 XDM/RD E2接続機能
X/Openに準拠したAPIを使用して,OLTP環境でリソースマネジャとしてXDM/RD E2を使用できます。
このとき,OLTPシステムはXDM/RD E2をHiRDBサーバとみなして動作します。したがって,HiRDBの関連マニュアルをお読みになる場合は,「HiRDB」を「XDM/RD E2」に置き換えてお読みください。
X/Openに準拠したAPIを使用して,XDM/RD E2に接続する場合に必要なVOS3のプログラムプロダクトのバージョンを次に示します。
上記のプログラムプロダクトに関連するプログラムプロダクトのバージョンについては,上記プログラムプロダクトのマニュアルを参照してください。
X/Openに準拠したAPIを使用して,XDM/RD E2に接続する場合に必要なVOS3のプログラムプロダクトの定義を次に示します。詳細については,各プログラムプロダクトのマニュアルを参照してください。
OLTPシステムがOpenTP1の場合,XDM/RD E2に接続できるユーザ数を一つ多く定義します。
一つのトランザクションからXDM/RD E2に対して複数のスレッドを使用して別々に接続できません。マルチスレッド環境でのXA接続は未サポートです。したがって,一つのトランザクションから同時に実行できるスレッドは一つであり,同一トランザクション内で複数のスレッドを使用してSQL文を同時に実行できません。
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インタフェースの仕様に準拠しています。
X/Open DTPモデルでのXDM/RD E2の位置づけを次の図に示します。
図3-4 X/Open DTPモデルでのXDM/RD E2の位置づけ
HiRDB XAライブラリでサポートする機能を次の表に示します。
ただし,XDM/RD E2をサーバとして使用する場合とHiRDBサーバを使用する場合では,サポートする機能が異なります。
表3-3 HiRDB XAライブラリでサポートする機能
| 機能 | 説明 | サポート有無 | |
|---|---|---|---|
| HiRDB サーバ |
XDM/RD E2 サーバ |
||
| トランザクションの移行 | トランザクションのコミット処理を,UAPがHiRDBにアクセスしたときと異なるサーバプロセスで実行する機能です。ここでいうUAPとは,HiRDB XAライブラリを使用してHiRDBに接続するUAPのことです。 | ○ | ×※ |
| 一相最適化 | 二相コミット制御を一相に最適化する機能です。 | ○ | ○ |
| 読み取り専用 | プリペア要求でHiRDBのリソースが更新されていない場合,トランザクションマネジャが二相目にコミット要求をしないで最適化する機能です。 | ○ | ○ |
| 動的トランザクションの登録 | UAPを実行する直前に,HiRDBが動的にトランザクションを登録する機能です。 | ○ | ○ |
| 非同期XA呼び出し | トランザクションマネジャが非同期にHiRDB XAライブラリを呼び出す機能です。 | × | × |
| 複数接続機能 | 一つのUAPからXDM/RD E2に対して複数のCONNECTを別々に実行する機能です。 X/Open XAインタフェース環境下での複数接続機能については,マニュアル「HiRDB Version 8 UAP開発ガイド」を参照してください。 |
○ | ○ |
トランザクションの移行は,XDM/RD E2に接続する場合には使用できません。
このため,HiRDBクライアント環境変数のPDXAMODEオペランドには0を指定するか,PDXAMODEオペランドの指定を省略してください。
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オプションを指定 | 該当しない | 可能 | |
trnstringオペランドについては,マニュアル「OpenTP1 Version 7 分散トランザクション処理機能 OpenTP1 システム定義」を参照してください。
コミット最適化およびプリペア最適化については,マニュアル「OpenTP1 Version 7 分散トランザクション処理機能 OpenTP1 プログラム作成の手引」を参照してください。
OLTPと連携するには,XDM/RD E2をトランザクションマネジャに登録する必要があります。XDM/RD E2をトランザクションマネジャに登録するには,OpenTP1のtrnlnkrmコマンドを使用します。
XDM/RD E2をトランザクションマネジャに登録するときには,次に示すどちらかの方法を選択してください。
なお,一つのトランザクションマネジャに対して,動的登録方法と静的登録方法を混在して使用できません。
XDM/RD E2をトランザクションマネジャに動的登録すると,トランザクション内で最初のSQL文を発行したときに,UAPがトランザクションマネジャの制御下に入ります。UAPがXDM/RD E2を含む複数のリソースマネジャをアクセスする場合,またはUAPがXDM/RD E2をアクセスするとは限らない場合などに,トランザクションマネジャからのXDM/RD E2に対するトランザクション制御のオーバヘッドを削減できます。
XDM/RD E2をトランザクションマネジャに静的登録すると,UAPがSQL文の発行に関係なく,トランザクションの開始時に常にトランザクションマネジャの制御下に入ります。
トランザクションマネジャがOpenTP1の場合,UAPとXDM/RD E2とのコネクションが切断されたとき(ユニットの異常終了またはサーバプロセスの異常終了などのとき)に,OpenTP1にはトランザクション開始時に再接続をする機能があるため,UAPの再起動が不要になります。
動的登録方法と静的登録方法の違いを次の表に示します。
表3-4 動的登録方法と静的登録方法の違い
| 差異のポイント | 動的登録方法 | 静的登録方法 |
|---|---|---|
| トランザクション開始時 | 管理しない |
|
| トランザクション内で最初のSQL発行時 |
|
|
| トランザクション処理中のトランザクションマネジャとXDM/RD E2間の通信回数 | SQL文数+コミット処理通信回数 | SQL文数+コミット処理通信回数+1(トランザクション開始処理用の通信分) |
| トランザクションマネジャとXDM/RD E2間のコネクションが,途中で切断したときの再接続方法※1 | 次回のトランザクション開始時に自動的に再接続※2 | 次回のトランザクション開始時に自動的に再接続※3 |
XDM/RD E2をリソースマネジャとしてトランザクションマネジャに登録する方法については,トランザクションマネジャのマニュアルを参照してください。このとき,次に示す情報をトランザクションマネジャに指定します。
動的登録方法にするか静的登録方法にするかは,RMスイッチ名の指定で決まります。XDM/RD E2のRMスイッチ名(xa_switch_t 構造体名)を次に示します。
RMスイッチ(xa_switch_t 構造体)で定義されているリソースマネジャ名は,HiRDB_DB_SERVERです。
トランザクションマネジャがxa_openでリソースマネジャをオープンするときに使用するオープン文字列は,複数接続機能を使用する場合に指定してください。複数接続機能を使用しない場合はオープン文字列を指定する必要はありません。
複数接続機能を使用する場合は,トランザクションマネジャに複数のXDM/RD E2を登録し,各XDM/RD E2に対してオープン文字列を指定します。オープン文字列には次に示す項目を指定します。
OSがUNIXの場合は,"環境変数グループ識別子+環境変数設定ファイル名"または"環境変数グループ識別子*環境変数設定ファイル名"の形式で指定します。
OSがWindowsの場合は,"環境変数グループ識別子+環境変数グループ名"または"環境変数グループ識別子*環境変数グループ名"の形式で指定します。
これ以外の形式で指定した場合は,オープン文字列が無視されます。
また,環境変数グループ識別子は4バイト固定,オープン文字列は全体で257バイト以下で指定してください。
トランザクションマネジャがOpenTP1の場合のオープン文字列の登録例を次に示します。
| リソースマネジャ | 環境変数グループ識別子 | 環境変数設定ファイル名 |
|---|---|---|
| XDMRD1 | XRD1 | /usr/conf/XDMRD/XDMRD11.ini /usr/conf/XDMRD/XDMRD12.ini |
| XDMRD2 | XRD2 | /usr/conf/XDMRD/XDMRD21.ini /usr/conf/XDMRD/XDMRD22.ini |
| リソースマネジャ | 環境変数グループ識別子 | 環境変数グループ名 |
|---|---|---|
| XDMRD1 | XRD1 | xdmrd11 xdmrd12 |
| XDMRD2 | XRD2 | xdmrd21 xdmrd22 |
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" |
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" |
trnrmid -n HiRDB_DB_SERVER -i X1,X2 |
トランザクションマネジャがxa_closeでリソースマネジャをクローズするときに使用するクローズ文字列は指定不要です。
RM関連オブジェクト名には,次に示すライブラリ名を指定します。
| ライブラリの種類 | ライブラリ名 | |
|---|---|---|
| 共用ライブラリ | シングルスレッド用 | libzclty.sl(libzcltx.sl) |
| シングルスレッド用 (複数接続機能対応) |
libzcltys.sl(libzcltxs.sl) | |
| アーカイブ ライブラリ |
シングルスレッド用 | libcltya.a(libcltxa.a) |
| ライブラリの種類 | ライブラリ名 |
|---|---|
| シングルスレッド用 | pdcltx32.lib |
| シングルスレッド用(複数接続機能対応) | pdcltxs.lib |
トランザクションマネジャにXDM/RD E2のトランザクション処理を制御させるためには,HiRDBのクライアント環境定義をトランザクションマネジャの定義に設定する必要があります。OLTP環境下でのクライアント環境定義の設定方法については,マニュアル「HiRDB Version 8 UAP開発ガイド」を参照してください。
トランザクションマネジャがOpenTP1の場合,クライアント環境定義のファイル名を次に示すOpenTP1のシステム定義に,putenv形式で定義する必要があります。
システム環境定義,ユーザサービスデフォルト定義,ユーザサービス定義,およびトランザクションサービス定義については,マニュアル「OpenTP1 Version 7 分散トランザクション処理機能 OpenTP1 システム定義」を参照してください。
なお,複数のOpenTP1と接続する場合は,HiRDBクライアント環境定義HiRDB_PDTMID,またはPDTMIDを必ず指定してください。
XDM/RD E2をOpenTP1に登録するには,OpenTP1のtrnlnkrmコマンドを使用します。trnlnkrmコマンドの指定例を次に示します。
trnlnkrm -a HiRDB_DB_SERVER -s pdtxa_switch -o /HiRDB/client/lib/libzcltx.sl |
trnlnkrm -a HiRDB_DB_SERVER -s pdtxa_switch -o C:\win32app\hitachi\hirdb_s\client\lib\pdcltx32.lib |
trnlnkrm -a HiRDB_DB_SERVER -s pdtxa_switch_y -o /HiRDB/client/lib/libzclty.sl |
trnlnkrm -a HiRDB_DB_SERVER -s pdtxa_switch_y -o C:\win32app\hitachi\hirdb_s\client\lib\pdcltx32.lib |
トランザクションマネジャへの登録を変更する場合には,次に示す手順に従ってトランザクションマネジャにXDM/RD E2を登録し直してください。
コネクションが切断された場合,実行中の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; ……………コネクション切断を記憶
}
}
}
|
動的登録方法の場合は,OpenTP1のトランザクションサービス定義またはユーザサービス定義のtrn_rm_open_close_scopeオペランドにtransactionを指定してください。transactionを指定することで,OpenTP1はトランザクションの開始または終了でXDM/RD E2とのコネクションを確立または切断します。したがって,途中でコネクションが切断されても,次回のトランザクションの開始時にコネクションが再接続されます。
静的登録方法の場合は,トランザクションの開始時にXDM/RD E2とのコネクションが確立されているかどうかをトランザクションマネジャが確認します。コネクションが切断されている場合は,自動的に再接続されて,トランザクションを開始します。
XDM/RD E2を使用する場合,TP1/Resource Manager Monitorの機能を使用したXDM/RD E2の監視はできません。
All Rights Reserved. Copyright (C) 2006, 2016, Hitachi, Ltd.