![]() ![]() ![]() ![]() |
注意 : | Oracle Tuxedo CORBA Java クライアントと Oracle Tuxedo CORBA Java クライアント ORB は Tuxedo 8.1 で非推奨になり、サポートされなくなりました。Oracle Tuxedo CORBA Java クライアントおよび Oracle Tuxedo CORBA Java クライアント ORB のテキスト参照、関連するコード サンプルはすべてサードパーティの Java ORB ライブラリの実装/実行の簡易化とプログラマによる参照だけに使用する必要があります。 |
注意 : | サード パーティの CORBA Java ORB のテクニカル サポートは、各ベンダによって提供されます。Oracle Tuxedo では、サード パーティの CORBA Java ORB に関する技術的なサポートやマニュアルは提供していません。 |
Oracle Tuxedo システムの最も基本的な機能の 1 つが、トランザクション管理です。トランザクションは、データベース トランザクションが誤りなく完了し、高性能トランザクションのすべての ACID 特性 (原子性、一貫性、独立性、および持続性) が確保されるようにする手段です。Oracle Tuxedo は、完全なインフラストラクチャを提供することでトランザクションの整合性を保護し、さまざまなリソース マネージャ (RM) にわたってデータベースが正しく更新されるようにします。いずれか 1 つのオペレーションが失敗した場合、一連のオペレーションがすべてロールバックされます。
リソース マネージャ (RM) は、データベース管理システムや Oracle Tuxedo システムの Application Queuing Manager のようなデータ リポジトリであり、データにアクセスするためのツールを備えています。Oracle Tuxedo システムは、1 つまたは複数の RM を使用してアプリケーションの状態を管理します。たとえば、銀行の預金残高のレコードは、RM に保存されています。預金引き出しサービスによってアプリケーションの状態が変わると、変更後の預金残高が、適切な RM に記録されます。
Oracle Tuxedo システムは、XA インタフェース対応の RM が関与するトランザクションを管理するのに役立ちます。Oracle Tuxedo システムは、トランザクション マネージャ (TM: Transaction Manager) として動作し、トランザクションに関連するすべての操作およびすべてのモジュールを調整します。
TM は、システム全体に渡るリソースが関与するグローバル トランザクションを調整します。個々のリソースは、ローカルのリソース マネージャ (RM) によって管理されます。トランザクション マネージャ サーバ (TMS: Transaction Manager Server) は、複数のリソースに関与するトランザクションの開始、コミット、およびアボートを行います。アプリケーション コードは、RM に対して標準の埋め込み型 SQL インタフェースを使用し、読み取りや更新を行います。TMS は、RM に対して XA インタフェースを使用し、グローバル トランザクション操作を実行します。
Oracle Tuxedo は、「The Common Object Request Broker: Architecture and Specification, Revision 2.4.2」(2001 年 1 月) に準拠し、C++ による Object Management Group の Common Object Request Broker (CORBA) をサポートします。
Oracle Tuxedo は、CORBA のオブジェクト トランザクション サービス (OTS) をサポートしています。Oracle Tuxedo は、OTS に対する C++ インタフェースを提供し、OTS に基づいています。OTS には、環境オブジェクト org.omg.CosTransactions.Current
を介してアクセスします。環境オブジェクト TransactionCurrent
の使用方法については、『Tuxedo CORBA プログラミング リファレンス』の「CORBA ブートストラップ処理のプログラミング リファレンス」を参照してください。
注意 : | Oracle Tuxedo では、CORBA Interoperable Naming Service (INS) ブートストラップ処理メカニズムも使用できます。INS の詳細については、『Tuxedo CORBA プログラミング リファレンス』の「CORBA ブートストラップ処理のプログラミング リファレンス」を参照してください。 |
OTS では、ビジネス トランザクションについて以下のサポートが提供されます。
Oracle Tuxedo CORBA は、エンタープライズ アプリケーションに対して分散トランザクションと 2 フェーズ コミット プロトコルをサポートしています。分散トランザクションは、データベースなど複数のリソース マネージャを調整しながら更新するトランザクションです。2 フェーズ コミット (2PC) プロトコルは、1 つまたは複数のリソース マネージャにわたる単一のトランザクションを調節する方法です。トランザクションで実行した、関連するすべてのデータベースへの更新処理をコミットするか、または完全にロールバックしてトランザクション開始時の状態に戻すことにより、データの整合性を保証できます。
トランザクションは、以下で述べる場合に適しています。以下はそれぞれ、Oracle Tuxedo CORBA でサポートされているトランザクション モデルです。
たとえば、旅行代理店アプリケーションがあるとします。クライアント アプリケーションは、たとえばフランスのストラスブールからオーストラリアのアリス スプリングスまでなど、遠隔地への旅行を手配する必要があります。このような旅行では、複数の予約が必要になります。クライアント アプリケーションでは、旅程の各区分の予約が順番に行われます。たとえば、ストラスブールからパリ、パリからニューヨーク、ニューヨークからロサンゼルスの予約が順番に行われます。ただし、いずれかのフライトの予約ができない場合、クライアント アプリケーションではそれまでに行ったフライトの予約をすべてキャンセルする必要があります。
たとえば、インターネット ベースのオンライン ショッピング カート アプリケーションがあるとします。クライアント アプリケーションのユーザは、オンライン カタログをブラウズして、複数の購入を選択します。ユーザはすべての品目を選択して購入を指定すると、チェック アウトに進み、クレジット カード情報を入力して購入を確定します。クレジット カードのチェックに失敗した場合、ショッピング アプリケーションでは、ショッピング カートで保留中のすべての購入選択をキャンセルするか、会話の最中に発生した購入トランザクションをロールバックする必要があります。
たとえば、銀行取引アプリケーションがあるとします。クライアントは、窓口オブジェクトに対して振替オペレーションを呼び出します。振替オペレーションは、銀行データベースに対して以下の呼び出しを実行するために窓口オブジェクトを必要とします。
図 1-1 は、Oracle Tuxedo CORBA アプリケーションのトランザクションを示しています。
トランザクションの使用方法は、Oracle ブートストラップ処理メカニズムを使用するか、Interoperable Naming Service (INS) ブートストラップ処理メカニズムを使用するかによって異なります。
注意 : | Oracle Tuxedo CORBA クライアント ソフトウェアを使用する場合は、Oracle ブートストラップ処理メカニズムを使用する必要があります。サード パーティのクライアントを使用する場合は、INS ブートストラップ処理メカニズムを使用する必要があります。 |
Oracle 独自のブートストラップ処理メカニズムを使用する場合、以下の方法で基本的なトランザクションを使用します。
Tobj::TransactionCurrent::begin()
オペレーションを使用してトランザクションを開始し、TP フレームワークを通じて CORBA インタフェースに要求を発行します。CORBA インタフェースのすべてのオペレーションは、トランザクションのスコープ内で実行されます。Tobj::TransactionCurrent::commit()
オペレーションを使用して現在のトランザクションをコミットします。このオペレーションは、トランザクションを終了して、オペレーションの処理を開始します。トランザクションは、トランザクションのすべての参加リソースがコミットに同意した場合にのみコミットされます。 Tobj::TransactionCurrent::commit()
オペレーションを実行すると、TP フレームワークはトランザクション マネージャを呼び出してトランザクションを完了します。
CORBA サービスの Interoperable Naming Service (INS) のブートストラップ処理メカニズムを使用する場合、以下の方法で基本的なトランザクションを使用します。
ORB::resolve_initial_references()
オペレーションを使用して、Oracle Tuxedo ドメインの FactoryFinder オブジェクトを取得します。注意 : | TransactionFactory は、Oracle の委譲型インタフェースではなく、標準の CORBA のトランザクション サービス インタフェースに準拠したオブジェクトを返します。これは、サード パーティのクライアントが、それぞれの ORB の resolve_initial_references() 関数を使用して Oracle Tuxedo CORBA サーバから TransactionFactory を取得し、標準 OMG IDL で生成されたスタブを使用して、返されたインスタンス上で機能できることを意味します。 |
create()
オペレーションを使用してトランザクションを開始し、TP フレームワークを介して CORBA インタフェースへの要求を発行します。 create()
オペレーションによって返された Control オブジェクトから、クライアント アプリケーションは、get_terminator()
オペレーションを使用してトランザクションの Terminator インタフェースを取得します。commit()
オペレーションまたは rollback()
オペレーションを使用して、トランザクションを終了またはアボートします。commit()
オペレーションを実行すると、TP フレームワークはトランザクション マネージャを呼び出してトランザクションを完了します。注意 : | CORBA インタフェースのすべてのオペレーションは、トランザクションのスコープ内で実行されます。 |
Terminator::commit()
オペレーションを使用して現在のトランザクションをコミットします。このオペレーションは、トランザクションを終了して、オペレーションの処理を開始します。トランザクションは、トランザクションのすべての参加リソースがコミットに同意した場合にのみコミットされます。 注意 : | INS の詳細については、『Tuxedo CORBA プログラミング リファレンス』の「CORBA ブートストラップ処理のプログラミング リファレンス」を参照してください。 |
Transactions サンプル CORBA アプリケーションでは、コースの登録のオペレーションがトランザクションのスコープ内で実行されます。Transactions サンプル アプリケーションで使用されるトランザクション モデルは、会話モデル、および単一のクライアントの呼び出しによってデータベース上で複数のオペレーションが実行されるモデルの組み合わせです。
Transactions サンプル アプリケーションは、以下のように機能します。
TooManyCredits
がサーバ アプリケーションからクライアント アプリケーションに返されます。続いて、クライアント アプリケーションによって、要求が拒否されたという内容の簡単なメッセージが表示されます。その際、クライアント アプリケーションはトランザクションをロールバックします。
図 1-2 では、Transactions サンプル アプリケーションのしくみを示しています。
Transactions サンプル アプリケーションは、次の 2 とおりの方法でトランザクションをロールバックします。
したがって、Transactions サンプル アプリケーションでも、ユーザ定義の CORBA 例外を実装する方法が示されています。たとえば、学生が登録可能なコースの最大数を超えているコースに登録しようとすると、サーバ アプリケーションは、TooManyCredits
例外を返します。クライアント アプリケーションは、この例外を受け取ると、自動的にトランザクションをロールバックします。
注意 : | Oracle Tuxedo CORBA アプリケーションにトランザクションが実装されるしくみについては、Oracle Tuxedo オンライン マニュアルの「Transactions サンプル アプリケーション」を参照してください。 |
ここでは、トランザクション処理コードが含まれる Oracle Tuxedo アプリケーションの以下の開発手順を説明します。
この開発手順では、Transactions サンプル アプリケーションを例に挙げて説明します。Transactions サンプル アプリケーションのソース ファイルは、Oracle Tuxedo ソフトウェアの \samples\corba\university
ディレクトリにあります。Transactions サンプル アプリケーションのビルドと実行の詳細については、Oracle Tuxedo オンライン マニュアルの「Transactions サンプル アプリケーション」を参照してください。
ほかの CORBA インタフェースの場合と同じように、トランザクションに関与するインタフェースを Object Management Group (OMG) インタフェース定義言語 (IDL) で指定する必要があります。また、そのインタフェースを使用して発生する可能性のあるすべてのユーザ例外を指定することも必要です。
Transactions サンプル アプリケーションでは、Registrar
インタフェースと register_for_courses()
オペレーションを OMG IDL で定義します。register_for_courses()
オペレーションには、NotRegisteredList
というパラメータがあります。このパラメータは、登録の失敗したコースのリストをクライアント アプリケーションに返します。NotRegisteredList
の値が空の場合、クライアント アプリケーションはトランザクションをコミットします。また、TooManyCredits
ユーザ例外も定義する必要があります。
コード リスト 1-1 は、Transactions サンプル アプリケーションの OMG IDL コードを示しています。
#pragma prefix "beasys.com"
module UniversityT
{
typedef unsigned long CourseNumber;
typedef sequence<CourseNumber> CourseNumberList;
struct CourseSynopsis
{
CourseNumber course_number;
string title;
};
typedef sequence<CourseSynopsis> CourseSynopsisList;
interface CourseSynopsisEnumerator
{
// エントリがない場合は長さ 0 のリストを返す
CourseSynopsisList get_next_n(
in unsigned long number_to_get, // 0 の場合はすべてが返される
out unsigned long number_remaining
);
void destroy();
};
typedef unsigned short Days;
const Days MONDAY = 1;
const Days TUESDAY = 2;
const Days WEDNESDAY = 4;
const Days THURSDAY = 8;
const Days FRIDAY = 16;
}
// スケジューリングされたすべての曜日の、正時に始まる
// 同じ時間帯に制限されたクラス
struct ClassSchedule
{
Days class_days; // 日のビットマスク
unsigned short start_hour; // 軍用時間による時間
unsigned short duration; // 分
};
struct CourseDetails
{
CourseNumber course_number;
double cost;
unsigned short number_of_credits;
ClassSchedule class_schedule;
unsigned short number_of_seats;
string title;
string professor;
string description;
};
typedef sequence<CourseDetails> CourseDetailsList;
typedef unsigned long StudentId;
struct StudentDetails
{
StudentId student_id;
string name;
CourseDetailsList registered_courses;
};
enum NotRegisteredReason
{
AlreadyRegistered,
NoSuchCourse
};
struct NotRegistered
{
CourseNumber course_number;
NotRegisteredReason not_registered_reason;
};
typedef sequence<NotRegistered> NotRegisteredList;
exception TooManyCredits
{
unsigned short maximum_credits;
};
// Registrar インタフェースは、学生がデータベース
// にアクセスするためのメインのインタフェース
interface Registrar
{
CourseSynopsisList
get_courses_synopsis(
in string search_criteria,
in unsigned long number_to_get,
out unsigned long number_remaining,
out CourseSynopsisEnumerator rest
);
CourseDetailsList get_courses_details(in CourseNumberList
courses);
StudentDetails get_student_details(in StudentId student);
NotRegisteredList register_for_courses(
in StudentId student,
in CourseNumberList courses
) raises (
TooManyCredits
);
};
// RegistrarFactory インタフェースが Registrar インタフェースを検索
interface RegistrarFactory
{
Registrar find_registrar(
);
};
トランザクション ポリシーは、インタフェースごとに使用されます。設計時に、Oracle Tuxedo CORBA アプリケーション内のどのインタフェースでトランザクションを処理するかを決定します。表 1-1 では、CORBA トランザクション ポリシーを説明します。
開発段階では、トランザクション ポリシーを割り当てることで、どのインタフェースがトランザクションで実行されるのかを定義します。実装コンフィグレーション ファイル (ICF) で、トランザクション ポリシーを指定します。genicf
コマンドを使用すると、テンプレートの ICF ファイルが作成されます。ICF の詳細については、『Tuxedo CORBA プログラミング リファレンス』の「実装コンフィグレーション ファイル (ICF)」を参照してください。
Transactions サンプル アプリケーションでは、Registrar
インタフェースのトランザクション ポリシーが always
に設定されます。
サーバ アプリケーションでトランザクションを使用する場合は、インタフェースのオペレーションを実装するメソッドを記述する必要があります。Transactions サンプル アプリケーションでは、register_for_courses()
オペレーションのメソッド実装を記述します。
Oracle Tuxedo アプリケーションでデータベースを使用する場合は、XA リソース マネージャを開閉するコードが CORBA サーバ アプリケーションで必要となります。それらのオペレーションは、Server オブジェクトの Server::initialize()
オペレーションと Server::release()
オペレーションに含められます。コード リスト 1-2 は、XA リソース マネージャを開く、および閉じる Transactions サンプル アプリケーションの Server オブジェクトのコードの一部分です。
注意 : | トランザクションを実装する CORBA サーバ アプリケーションの完全な例については、Oracle Tuxedo オンライン マニュアルの「Transactions サンプル アプリケーション」を参照してください。 |
CORBA::Boolean Server::initialize(int argc, char* argv[])
{
TRACE_METHOD("Server::initialize");
try {
open_database();
begin_transactional();
register_fact();
return CORBA_TRUE;
}
catch (CORBA::Exception& e) {
LOG(“CORBA exception : “ <<e);
}
catch (SamplesDBException& e) {
LOG(“Can’t connect to database”);
}
catch (...) {
LOG(“Unexpected database error : “ <<e);
}
catch (...) {
LOG(“Unexpected exception”);
}
cleanup();
return CORBA_FALSE;
}
void Server::release()
{
TRACE_METHOD(“Server::release”);
cleanup();
}
static void cleanup()
{
unregister_factory();
end_transactional();
close_database();
}
// トランザクション リソース マネージャを管理するユーティリティ
CORBA::Boolean s_became_transactional = CORBA_FALSE;
static void begin_transactional()
{
TP::open_xa_rm();
s_became_transactional = CORBA_TRUE;
}
static void end_transactional()
{
if(!s_became_transactional){
return// クリーンアップは不要
}
try {
TP::close_xa_rm ();
}
catch (CORBA::Exception& e) {
LOG(“CORBA Exception : “ << e);
}
catch (...) {
LOG(“unexpected exception”);
}
s_became_transactional = CORBA_FALSE;
}
クライアント アプリケーションでは、次のタスクを実行するコードが必要です。
コード リスト 1-3 は、トランザクションの開発手順を説明する Transactions サンプル アプリケーションの CORBA C++ クライアント アプリケーションの一部分です。
注意 : | コード リスト 1-3 で示されているサンプル コードは、Oracle ブートストラップ処理メカニズムの使用方法を示したものです。INS ブートストラップ処理メカニズムを使用方法については、『Tuxedo CORBA プログラミング リファレンス』の「CORBA ブートストラップ処理のプログラミング リファレンス」を参照してください。 |
CORBA::Object_var var_transaction_current_oref =
Bootstrap.resolve_initial_references(“TransactionCurrent”);
CosTransactions::Current_var transaction_current_oref=
CosTransactions::Current::_narrow(var_transaction_current_oref.in());// トランザクションを開始
var_transaction_current_oref->begin();
try {
// トランザクション内でオペレーションを実行
pointer_Registar_ref->register_for_courses(student_id, course_number_list);
...
// オペレーションがエラーなしで実行された場合は、トランザクションをコミット
CORBA::Boolean report_heuristics = CORBA_TRUE;
var_transaction_current_ref->commit(report_heuristics);
}
catch (...) {
// オペレーションで実行エラーが発生した場合は、トランザクションを
// ロールバック。次に元の例外を再び送出する
// ロールバックが失敗した場合、例外を無視し、
// 元の例外を再び送出する
try {
var_transaction_current_ref->rollback();
}
catch (...) {
TP::userlog("rollback failed");
}
throw;
}
トランザクション対応 Oracle Tuxedo アプリケーションのコンフィグレーション ファイルには、次の情報を追加する必要があります。
GROUPS
セクションOPENINFO
パラメータで、データベースのリソース マネージャを開く際に必要な情報を指定します。この情報は、データベースの製品マニュアルから取得します。デフォルト バージョンの com.beasys.Tobj.Server.initialize
メソッドは、自動的にリソース マネージャを開きます。CLOSEINFO
パラメータで、データベースのリソース マネージャを閉じる際に必要な情報を指定します。デフォルトでは、CLOSEINFO
パラメータは空です。TMSNAME
パラメータと TMSCOUNT
パラメータを指定して、XA リソース マネージャを、指定したサーバ グループに関連付けます。SERVERS
セクションで、インタフェースがあるサーバ アプリケーションと、データベースを管理するサーバ アプリケーションの両方を含むサーバ グループを定義します。このサーバ グループは、トランザクションとして指定する必要があります。TLOGDEVICE
パラメータで、トランザクション ログ (TLOG
) にパス名を指定します。トランザクション ログの詳細については、「トランザクションの管理」を参照してください。
コード リスト 1-4 は、Transactions サンプル アプリケーションのコンフィグレーション ファイルでこの情報が定義されている部分です。
*RESOURCES
IPCKEY 55432
DOMAINID university
MASTER SITE1
MODEL SHM
LDBAL N
SECURITY APP_PW
*MACHINES
BLOTTO
LMID = SITE1
APPDIR = C:\TRANSACTION_SAMPLE
TUXCONFIG=C:\TRANSACTION_SAMPLE\tuxconfig
TLOGDEVICE=C:\APP_DIR\TLOG
TLOGNAME=TLOG
TUXDIR="C:\tuxdir"
MAXWSCLIENTS=10
*GROUPS
SYS_GRP
LMID = SITE1
GRPNO = 1
ORA_GRP
LMID = SITE1
GRPNO = 2
OPENINFO = "ORACLE_XA:Oracle_XA+SqlNet=ORCL+Acc=P
/scott/tiger+SesTm=100+LogDir=.+MaxCur=5"
CLOSEINFO = ""
TMSNAME = "TMS_ORA"
TMSCOUNT = 2
*SERVERS
DEFAULT:
RESTART = Y
MAXGEN = 5
TMSYSEVT
SRVGRP = SYS_GRP
SRVID = 1
TMFFNAME
SRVGRP = SYS_GRP
SRVID = 2
CLOPT = "-A -- -N -M"
TMFFNAME
SRVGRP = SYS_GRP
SRVID = 3
CLOPT = "-A -- -N"
TMFFNAME
SRVGRP = SYS_GRP
SRVID = 4
CLOPT = "-A -- -F"
TMIFRSVR
SRVGRP = SYS_GRP
SRVID = 5
UNIVT_SERVER
SRVGRP = ORA_GRP
SRVID = 1
RESTART = N
ISL
SRVGRP = SYS_GRP
SRVID = 6
CLOPT = -A -- -n //MACHINENAME:2500
*SERVICES
トランザクション ログの詳細とコンフィグレーション ファイルのパラメータの定義については、「トランザクションの管理」を参照してください。
![]() ![]() ![]() |