ヘッダーをスキップ
Oracle® Databaseインストレーションおよび構成ガイド
11gリリース2 (11.2) for Fujitsu BS2000/OSD
E49830-02
  ドキュメント・ライブラリへ移動
ライブラリ
製品リストへ移動
製品
目次へ移動
目次
索引へ移動
索引

前
 
次
 

8 openUTM製品セット

この章では、BS2000/OSDのトランザクション・モニターであるopenUTMをOracle Database 11gリリース2 (11.2)との調整された相互運用に使用する方法を説明します。内容は次のとおりです。

8.1 openUTMプログラムを使用したOracle Databaseの操作

Universal Transaction Monitor (openUTM)は、多数の端末から同時に使用できるユーザー・プログラムの実行を制御します。

openUTMアプリケーションは、処理ステージの構造化された順序で構成され、処理ステージでは特定のユーザーに対してアクセス権が提供されます。これらのステージは、順番に全体で実行されるか、まったく実行されないopenUTMトランザクションで構成されます。

複数のユーザーがopenUTMで同時に作業している場合、共有データベースへの同時アクセスも通常必要になります。データベースおよびデータ通信システム(DB/DCシステム)であるOracle Database/openUTMは、Oracle Databaseに対するopenUTMアプリケーションによるアクセスを同期化し、データベースの整合性のある状態を保ちます。システム障害が発生した場合、DB/DCシステムが自動リカバリを実行することで、データベースの整合性が保たれます。

OracleおよびopenUTMの同期化はXAインタフェースを介して実行されます。XAシステムは、データベース・システムとトランザクション監視を調整するためのX/Openインタフェースです。XAインタフェースの概念の詳細は、『Oracle Databaseアドバンスト・アプリケーション開発者ガイド』のOracle XAを使用したアプリケーションの開発に関する説明を参照してください。

8.2 配布されたopenUTMファイル

第3章、「Oracle Databaseのインストールおよび削除」に従ってOracle Databaseをインストールすると、Oracle DatabaseソフトウェアのopenUTM関連のソフトウェアがインストールされます。配布されたopenUTMファイルは、次のファイルで構成されます。

  • XAO.LIB

    このファイルにはXAインタフェースの接続モジュールが含まれています。

  • 次のファイルでは、プロシージャおよびプログラムのサンプルが提供されます。

    UTM.DEMO.P.COMPILE.C
    UTM.DEMO.P.COMPILE.COBOL
    UTM.DEMO.P.KDCDEF
    UTM.DEMO.P.KDCROOT
    UTM.DEMO.P.PROBIND
    UTM.DEMO.P.PROSTRT
    UTM.DEMO.CSELEMP.PC
    UTM.DEMO.SELDEP.PCO
    UTM.DEMO.SELEMP.PCO
    UTM.DEMO.UPDEMP.PCO
    UTM.DEMO.ERRSQL.C
    UTM.DEMO.ERRTXT.C
    

8.3 インストール

『Oracle Databaseアドバンスト・アプリケーション開発者ガイド』を確認した後に、次の手順を実行してインストールします。

  • Oracle Databaseに接続するすべてのopenUTMユーザーに、DBA_PENDING_TRANSACTIONS表に対してSELECT権限を付与します。次の例を使用して、ユーザーscottSELECT権限を付与します。

    grant select on DBA_PENDING_TRANSACTIONS to scott;
    

    openUTMユーザーは、オープン文字列内で項目Accで識別されます。この章の「オープン文字列の定義」の項を参照してください。

8.4 Oracle Database/openUTMアプリケーションの開発

BS2000上のOracle Database 11gでは、openUTM V6.0以上がサポートされます。openUTMではXAインタフェースがサポートされます。BS2000上のOracle Database 11gは、このXAインタフェースを介してopenUTMと連携します。

openUTMとの調整された相互運用のためのOracle Databaseアプリケーションの開発に関する手順について、この項で説明します。主要な手順は次のとおりです。

  1. openUTMプログラム・ユニットを作成

  2. 構成を定義

  3. KDCROOT表モジュールおよびopenUTMプログラム・ユニットを変換

  4. openUTMアプリケーション・プログラムをリンク

  5. openUTMアプリケーションを起動

さらに、この項では、オープン文字列の定義方法およびOracle XAライブラリでのプリコンパイラの使用方法についても説明します。

  1. openUTMプログラム・ユニットを作成

    (openUTMのマニュアル『Programming Applications with KDCS for COBOL, C, and C++』、および『Oracle Databaseユーザーズ・ガイドfor Fujitsu BS2000/OSD』を参照)

  2. 構成を定義

    (openUTMのマニュアル『Generating Applications』および『Administering Applications』を参照)

    Oracle Database/openUTMアプリケーションを実行するには、次の情報が必要です。

    • アプリケーションに関する情報

    • アクセス保護されたユーザー名およびパスワード

    • 端末および通信パートナに関する情報

    • トランザクション・コードに関する情報

    これらのプロパティは構成を集合的に形成し、この構成はKDCFILEファイルに格納されます。構成定義はKDCDEFユーティリティによって実行されます。

    この項では、Oracle Databaseへの接続時に重要な3つのコマンドについて説明します。次のコマンドがあります。

    • DATABASE

      Oracle Database/openUTMアプリケーションが生成されたら、openUTMがOracle Databaseと通信することを指定する必要があります。次のコマンドを入力して、データベースとのopenUTMの通信を指定します。

      DATABASE TYPE=XA,ENTRY=XAOSWD
      

      ここでTYPE=XAはXAインタフェースの使用を指定し、ENTRY=XAOSWDはOracle DatabaseのXAスイッチの名前(動的登録の場合)を指定します。

    • OPTION

      OPTIONコマンドで対応するGENオペランドを指定した場合、KDCDEFユーティリティによってKDCROOT表モジュールのソースコードも生成されます。OPTIONの構文は次のとおりです。

      OPTION [DATA=filename][,GEN={KDCFILE|ROOTSRC|NO|ALL}]
      [,ROOTSRC=filename][,SHARETAB=filename]
      [,TEST={N[o]|Y[ES]}]
      
    • MAX

      もう一つの重要なオペランドはAPPLIMODEで、これはMAXコマンドで指定されます。これはシステム障害後の再起動動作を定義します。MAXの構文は次のとおりです。

      MAX APPLINAME=name[,APPLIMODE={S[ECURE]|F[AST]}]
      [,ASYNTASKS=number][...]
      

      APPLIMODE=SECUREは、アプリケーション障害の後に、openUTMアプリケーションとOracle Databaseの調整されたウォーム・スタートを使用してopenUTMが継続することを意味します。

      APPLIMODE=FASTを指定した場合は、openUTMに再起動情報が格納されていないためopenUTMアプリケーションの再起動は実行されません。エラーが発生した場合、アプリケーションは最初から起動されます。openUTMアプリケーションの障害後に開いたままのトランザクションは、自動的にロールバックされます。

    KDCFILEおよびKDCROOT表モジュールを作成するためのサンプルのプロシージャは、UTM.DEMO.P.KDCDEFファイルを参照してください。

  3. KDCROOT表モジュールおよびopenUTMプログラム・ユニットを変換

    KDCROOT表モジュールのソースはBS2000のAssemblerを使用してコンパイルされる必要があり、openUTMプログラム・ユニットは、対応するプログラミング言語のコンパイラを使用してコンパイルされる必要があります。KDCROOT表モジュールのコンパイルは、サンプルのプロシージャUTM.DEMO.P.KDCROOTを参照してください。

  4. openUTMアプリケーション・プログラムをリンク

    openUTMアプリケーション・プログラムは、KDCROOT表モジュールをopenUTMプログラム・ユニットにリンクすることによって生成されます。

    stubモジュールXAOSTUBを含む必要があります。

    INC-MOD LIB=ORAUID.XAO.LIB,ELEM=XAOSTUB
    

    注意:

    バインド・プロシージャを記述するかわりに、サンプルのプロシージャUTM.DEMO.P.PROBINDを使用して、必要なときに変更を適用します。

    独自のバインド・プロシージャを記述する必要がある場合は、記述する前にサンプルを慎重に確認してください。


  5. openUTMアプリケーションを起動

    openUTMアプリケーションを開始するためのサンプルのプロシージャは、ファイルUTM.DEMO.P.PROSTRTにあります。

    openUTMアプリケーションを起動する場合は、openUTMの開始パラメータとともにOracle Databaseの開始パラメータを指定する必要があります。

    openUTMの開始パラメータについては、openUTMのマニュアル『Using openUTM Applications under BS2000/OSD』を参照してください。

    Oracle Database 10gとの調整された相互運用のためにXAインタフェースを使用するための開始パラメータは、次のとおりです。

    .RMXA RM="Oracle_XA",OS="<ORACLE open string>"
    

8.4.1 オープン文字列の定義

この項では、オープン文字列の構成方法について説明します。トランザクション・モニターは、データベースを開くためにこの文字列を使用します。オープン文字列内の最大文字数は256文字で、オープン文字列の最大数は8個です。次のように文字列を構成します。

Oracle_XA{+required_fields...}[+optional_fields...]

required_fieldsは次のとおりです。

  • Acc=P/user/access_info

  • SesTm=session_time_limit

optional_fieldsは次のとおりです。

  • DB=db_name

  • MaxCur=maximum_no_of_open_cursors

  • SqlNet=connect_string

  • DbgFl=value_from_1_to_15


注意:

次の点に注意してください。

  • オープン文字列の作成時には、必須フィールドおよびオプションのフィールドをどのような順序でも入力できます。

  • システムによって値は大/小文字が区別される場合とされない場合がありますが、すべてのフィールド名は大/小文字が区別されます。

  • 実際のオープン文字列の一部にプラス文字(+)は使用できません。


8.4.1.1 必須フィールド

オープン文字列の必須フィールドは次のとおりです。

項目 意味
Acc ユーザー・アクセス情報を指定します。
P 明示的なユーザーおよびパスワード情報が提供されていることを示します。
user 有効なOracle Databaseのユーザー名。
access_info 対応する現在のパスワード。

たとえば、Acc=P/scott/tigerは、ユーザーおよびパスワードの情報が提供されていることを示します。この場合、ユーザーはscottでパスワードはtigerです。

正しい処理を行うには、scottにはDBA_PENDING_TRANSACTIONS表に対してSELECT権限が必要です。

項目 意味
SesTm システムで自動的に削除されるまでに、トランザクションが非アクティブで存在できる最大時間を指定します。
session_time_limit この値は、グローバル・トランザクションを開始し、そのトランザクションのコミットまたはロールバックの完了に必要な最大時間に対応する必要があります。

8.4.1.2 オプションのフィールド

オープン文字列のオプションのフィールドを次の表に示します。

項目 意味
DB データベースの名前を指定します。
db_name Oracle Databaseプリコンパイラがデータベースの識別に使用する名前を指定します。

Oracle Databaseプリコンパイラのデフォルトのデータベースのみを使用する(SQL文でAT句を使用しない)アプリケーション・プログラムでは、オープン文字列のDB=db_name句を省略する必要があります。

注意: このデフォルトのデータベースは、ORAENVファイルでORASIDで表現されます。

明示的に指定したデータベースを使用するアプリケーションは、DB=db_nameフィールドにそのデータベース名を指定する必要があります。

たとえば、DB=payrollは、データベース名がpayrollであり、アプリケーション・サーバー・プログラムがこの名前をAT句で使用することを示します。


プリコンパイラ(特にPro*C)の詳細は、この章で後述する項「openUTMでのプリコンパイラの使用」を参照してください。

項目 意味
MaxCur データベースのオープン時に割り当てられるカーソルの数を指定します。これは、プリコンパイラ・オプションmaxopencursorsと同じ用途で機能します。
maximum_no_of_open_cursors オープン・カーソルの数を指定します。デフォルトは10です。

たとえば、MaxCur=5は、処理で5つのオープン・カーソルのキャッシュを試みることを示します。

maxopencursorsの詳細は、『Oracle Database Oracleプリコンパイラのためのプログラマーズ・ガイド』を参照してください。

項目 意味
SqlNet SQL*Net接続文字列を指定します。
connect_string システムにログオンするために使用される文字列を示します。これには、サポートされている任意のOracle Net Services接続文字列を使用できます。

たとえば、次のようになります。

SqlNet=MADRID_FINANCEは、TNSNAMES.ORA内のエントリがプロトコル、ホストおよびポート番号を参照することを示します。詳細は、このブックの第9章、「Oracle Net Services」を参照してください。

項目 意味
DbgFl デバッグを有効(デバッグ・フラグ)にするかどうかを指定します。詳細は、この章で後述するデバッグに関する説明を参照してください。

8.4.1.3

この項に、前述の情報を使用したオープン文字列の例を示します。


注意:

文字列が1行を超える場合は、openUTMドキュメントの文字列情報を分割する方法に関する説明を参照してください。

Bequeathプロトコルの場合:

Oracle_XA+Acc=P/scott/tiger+SesTm=0+DbgFl=15

その他のプロトコルの場合:

Oracle_XA+SqlNet=MADRID_FINANCE+Acc=P/scott/tiger+SesTm=0
Oracle_XA+DB=finance+SqlNet=MADRID_FINANCE+Acc=P/scott/tiger
+SesTM=0

オプションのフィールドLogDirLoose_CouplingSesWTおよびThreadsはサポートされていません。

オープン文字列のフィールドの詳細は、『Oracle Databaseアドバンスト・アプリケーション開発者ガイド』「Oracle XAを使用したアプリケーションの開発」を参照してください。

8.4.2 openUTMでのプリコンパイラの使用

プリコンパイラとのインタフェースは、次の2つのオプションから選択できます。

  • デフォルトのデータベースでのプリコンパイラの使用

  • 指定されたデータベースでのプリコンパイラの使用

すべてのプリコンパイラ・プログラムは、オプションrelease_cursornoに設定して実行する必要があります。プリコンパイラ・プログラムはCまたはCOBOLで記述できます。次の例では、プリコンパイラPro*Cが使用されています。

8.4.2.1 デフォルト・データベースでのPro*Cの使用

デフォルトのデータベースでPro*Cにインタフェースするには、オープン文字列で使用されるDB=db_nameフィールドが存在しないことを確認してください。このフィールドが存在しないことは、ORAENVファイルで定義されているとおりのデフォルト接続を示し、各プロセスで1つのデフォルト接続のみが許可されていることを示します。

デフォルトのPro*C接続を識別するオープン文字列の例を次に示します。

Oracle_XA+SqlNet=MADRID_FINANCE+Acc=P/scott/tiger+SesTm=0

ここで、DB=db_nameが存在せず、空のデータベースID文字列であることを示しています。

SELECT文の構文を次に示します。

EXEC SQL SELECT ENAME FROM EMP;

8.4.2.2 指定されたデータベースでのPro*Cの使用

指定されたデータベースでPro*Cにインタフェースするには、オープン文字列にDB=db_nameフィールドを含めます。参照するすべてのデータベースは、対応するオープン文字列で指定した同じdb_nameを参照する必要があります。

アプリケーションには、デフォルトのデータベースだけでなく、次に示すとおり、1つ以上の指定されたデータベースが含まれている場合があります。

たとえば、あるデータベースで従業員の給与を更新し、別のデータベースで部門番号(deptno)を、3つ目のデータベースで管理者情報を更新するとします。トランザクション・マネージャで次のオープン文字列を構成します。

Oracle_XA+SqlNet=MADRID_FINANCE1+Acc=P/scott/tiger+SesTm=0
Oracle_XA+DB=MANAGERS+SqlNet=MADRID_FINANCE2+
Acc=P/scott/tiger+SesTm=0
Oracle_XA+DB=PAYROLL+SqlNet=MADRID_FINANCE3+
Acc=P/scott/tiger+SesTm=0

最初のオープン文字列にはDB=db_nameフィールドがありません。

アプリケーション・プログラムでは、次のような宣言を入力します。

EXEC SQL DECLARE PAYROLL DATABASE; 
EXEC SQL DECLARE MANAGERS DATABASE;

ここでも、db_nameフィールドを含まない最初のオープン文字列に対応するデフォルトの接続には宣言は必要ありません。

更新を実行するときは、次のような文を入力します。

EXEC SQL AT PAYROLL update emp set sal=4500 where empno=7788;
EXEC SQL AT MANAGERS update emp set mgr=7566 where empno=7788;
EXEC SQL update emp set deptno=30 where empno=7788;

最後の文ではデフォルトのデータベースを参照しているため、AT句はありません。

次の例に示すとおり、AT句で文字ホスト変数を使用できます。

EXEC SQL BEGIN DECLARE SECTION;
db_name1 CHARACTER(10);
db_name2 CHARACTER(10)
EXEC SQL END DECLARE SECTION;
.
.
set db_name1 = 'PAYROLL' 
set db_name2 = 'MANAGERS'
.
.
EXEC SQL AT :db_name1 UPDATE...
EXEC SQL AT :db_name2 UPDATE...

詳細は、Pro*COBOLプログラマーズ・ガイドおよびPro*C/C++プログラマーズ・ガイドの同時ログオンに関する説明を参照してください。


注意:

  • アプリケーション・サーバーが独自のOracle Database接続を作成することはできません。そのため、openUTMユーザーは、openUTMプログラム内でCONNECT文を発行することはできません。それによって実行されたすべての作業はグローバル・トランザクション外であり、openUTMに指定されている接続情報と混同する可能性があります。

  • SQLコールは、openUTMの開始終了ルーチン内では実行できませんが、対話終了ルーチン(Vorgangs-Exit)では実行できます。


8.5 トラブルシューティング

この項では、問題またはシステム障害が発生した場合にデータをリカバリする方法を説明します。この後の項で、トレース・ファイルとペンディング・トランザクションのリカバリの両方について説明します。

8.5.1 トレース・ファイル

Oracle XAライブラリでは、すべてのエラーおよびトレース情報がトレース・ファイルに記録されます。この情報は、XAエラー・コードを補足するときに役立ちます。たとえばオープン障害が発生した場合の原因として、オープン文字列が正しくなかったか、Oracle Databaseインスタンスの検索が正常に実行されなかったか、ログイン認可に失敗したかを示すことができます。トレース・ファイルの名前は次のとおりです。

ORAXALOG.pid-db_name-date.TRC

各パラメータの意味は次のとおりです。

pidはプロセス識別子(TSN)です。

db_nameは、オープン文字列フィールドDB=db_nameで指定したデータベース名です。

dateは、トレース・ファイルが作成された日付です。

8.5.1.1 トレース・ファイルの例

この項では、トレース・ファイルの2つの種類について説明します。

次の例に、1999年4月2日にオープンされたアプリケーション・タスク1234のトレース・ファイルを示します。リソース・マネージャが開かれたときに、このアプリケーションのDBフィールドはオープン文字列で指定されていませんでした。

ORAXALOG.1234-NULL-990402.TRC

次の例に、1998年12月15日にタスク5678によって作成されたトレース・ファイルを示します。リソース・マネージャがオープンされたときに、DBフィールドはオープン文字列でFINANCEと指定されていました。

ORAXALOG.5678-FINANCE-981215.TRC

トレース・ファイルの各エントリには、次のような情報が含まれています。

1032.2: xa_switch rtn ORA-22

ここで1032は情報が記録された時間、2はリソース・マネージャ識別子、xa_switchはモジュール名、ORA-22は返されたOracle Database情報です。

8.5.2 デバッグ

オープン文字列にDbgFl (デバッグ・フラグ)を指定できます。詳細は、『Oracle Databaseアドバンスト・アプリケーション開発者ガイド』Oracle XAに関する説明を参照してください。

デバッグ・レベルに応じて(low:DbgFl=1、high:DbgFl=15)、トレース・ファイルORAXALOG.pid-db_name-date.TRCにいくつかのエントリが含まれます(前述の項を参照)。

8.5.3 インダウトまたはペンディングのトランザクション

インダウト・トランザクションまたはペンディング・トランザクションとは、準備はできているがデータベースに対してまだコミットされていないトランザクションです。通常、openUTMは、すべての障害およびインダウトまたはペンディング・トランザクションのリカバリを解決します。ただし、データベース管理者は、たとえばインダウト・トランザクションが次の場合に、UTM-F (APPLIMODE=FAST)を使用してインダウト・トランザクションを無視する必要がある場合があります。

  • 他のトランザクションが必要とするデータをロックしている場合

  • 適切な時間の経過後も解決されない場合


注意:

インダウト・トランザクションを無視することによって、openUTMとデータベース間で矛盾が発生することがあります。たとえば、データベース管理者によってDBトランザクションがコミットされ、openUTMアプリケーションがウォーム・スタート・フェーズでそのトランザクションをロールバックした場合、Oracle Databaseはこのコミットされたトランザクションをロールバックできないため、矛盾が発生します。

8.5.4 Oracle DatabaseのSYSアカウント表

Oracle DatabaseのSYSアカウントには4つの表があり、正規のOracle DatabaseアプリケーションおよびOracle Database/openUTMアプリケーションによって生成されたトランザクションが含まれています。これらを次に示します。

  • DBA_2PC_PENDING

  • DBA_2PC_NEIGHBORS

  • DBA_PENDING_TRANSACTIONS

  • V$GLOBAL_TRANSACTION


注意:

これらの表の使用方法の詳細は、『Oracle Database管理者ガイド』の2フェーズ・コミット時の障害およびインダウト・トランザクションの手動による無視に関する説明を参照してください。

Oracle Database/openUTMアプリケーションによって生成されたトランザクションの場合は、次の列情報がDBA_2PC_NEIGHBORS表に明確に適用されます。

  • DBID列は常にxa_orclです。

  • DBUSER_OWNER列は常にdb_namexa.oracle.comです。

db_nameは、オープン文字列で常にDB=db_nameと指定されることに注意してください。オープン文字列にこのフィールドを指定しないと、この列の値はOracle Database/openUTMアプリケーションが生成するトランザクションではNULLxa.oracle.comになります。

たとえば、次のサンプルのSQL文を使用すると、Oracle Database/openUTMアプリケーションによって生成されたインダウト・トランザクションの詳細情報を取得できます。

SELECT * FROM DBA_2PC_PENDING p, DBA_2PC_NEIGHBORS n 
WHERE p.LOCAL_TRAN_ID = n.LOCAL_TRAN_ID AND n.DBID = 'xa_orcl';