![]() ![]() ![]() ![]() ![]() ![]() ![]() |
注意: | 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製品では、データベースの更新が(様々なリソース・マネージャにまたがる場合でも)誤りなく実行されるようにする完全なインフラストラクチャによってトランザクションの整合性が保護されます。操作が1つでも失敗すると、操作全体がロールバックされます。
リソース・マネージャ(RM)は、データベース管理システムやOracle TuxedoシステムのApplication Queuing Managerのようなデータ・リポジトリであり、データにアクセスするためのツールを備えています。Oracle Tuxedoシステムは、1つ以上のRMを使用してアプリケーションの状態を管理します。たとえば、銀行の預金残高のレコードは、RMに保存されています。預金引出しサービスによってアプリケーションの状態が変わると、変更後の預金残高が適切なRMに記録されます。
Oracle Tuxedoシステムは、XAインタフェース対応のリソース・マネージャが関与するトランザクションを管理するのに役立ちます。Oracle Tuxedoシステムは、トランザクション・マネージャ(TM: Transaction Manager)として動作し、トランザクションに関連するすべての操作およびすべてのモジュールを調整します。
TMは、システム全体に渡るリソースが関与するグローバル・トランザクションを調整します。個々のリソースは、ローカルのリソース・マネージャ(RM)によって管理されます。トランザクション・マネージャ・サーバー(TMS: Transaction Manager Server)は、複数のリソースに関与するトランザクションの開始、コミット、および停止を行います。アプリケーション・コードは、RMに対して標準の埋め込み型SQLインタフェースを使用し、読み取りや更新を行います。TMSは、RMに対してXAインタフェースを使用し、グローバル・トランザクション操作を実行します。
Oracle Tuxedoは、C++でObject Management GroupのCommon Object Request Broker(CORBA)をサポートしており、「The Common Object Request Broker: Architecture and Specification, Revision 2.4.2」(2001年1月)に準拠しています。
Oracle Tuxedoでは、CORBAサービスのObject Transaction Service(OTS)をサポートしています。Oracle TuxedoにはOTSへのC++インタフェースが用意されており、OTSに基づいています。OTSには、org.omg.CosTransactions.Current
環境オブジェクトを使用してアクセスします。TransactionCurrent
環境オブジェクトの使用方法の詳細は、CORBAプログラミング・リファレンスのCORBAブートストラップ処理のプログラミング・リファレンスに関する項を参照してください。
注意: | Oracle Tuxedoでは、CORBA Interoperable Naming Service(INS)ブートストラップ処理メカニズムの使用もサポートされています。INSの詳細は、CORBAプログラミング・リファレンスのCORBAブートストラップ処理のプログラミング・リファレンスに関する参照してください。 |
OTSでは、ビジネス・トランザクションについて以下のサポートが提供されます。
Oracle Tuxedo CORBAでは、エンタープライズ・アプリケーションの分散トランザクションと2フェーズ・コミット・プロトコルがサポートされます。分散トランザクションとは、複数のリソース・マネージャ(データベースなど)が調和的に更新されるトランザクションのことです。2フェーズ・コミット・プロトコル(2PC)は、複数のリソース・マネージャにまたがって1つのトランザクションを調整する手段です。これにより、トランザクションによる更新を関連するデータベースのすべてでコミットするか、すべてのデータベースから完全にロールバックし、トランザクション開始前の状態に戻すことで、データの整合性が保証されます。
トランザクションは次のリストで説明される状況に適しています。それぞれの状況は、Oracle Tuxedo CORBAでサポートされているトランザクション・モデルを説明しています。
たとえば、旅行代理店アプリケーションがあるとします。クライアント・アプリケーションは、たとえばフランスのストラスブールからオーストラリアのアリス・スプリングスまでなど、遠隔地への旅行を手配する必要があります。このような旅行では、複数の予約が必要になります。クライアント・アプリケーションでは、旅程の各区分の予約が順番に行われます。たとえば、ストラスブールからパリ、パリからニューヨーク、ニューヨークからロサンゼルスの予約が順番に行われます。しかし、いずれかのフライトが予約できないとき、クライアント・アプリケーションにはその時点で予約済みの他のフライトをすべてキャンセルする方法が必要です。
たとえば、インターネット・ベースのオンラインのショッピング・カート・アプリケーションについて考えてみます。クライアント・アプリケーションのユーザーがオンライン・カタログを一覧して、購入する物を複数選択します。ユーザーは、購入したい商品をすべて選択したら、支払に進み、クレジット・カード情報を入力して購入します。クレジット・カードの確認が失敗した場合、ショッピング・アプリケーションでは、ショッピング・カート内の未決済の購入商品をすべて取り消すか、やり取りの際に行われたすべての購入トランザクションをロールバックできる必要があります。
たとえば、銀行のアプリケーションを考えてください。クライアントでは、出納オブジェクトに対して送金処理を呼び出します。送金処理においては、出納オブジェクトは銀行のデータベースで以下の呼出しを行わなければなりません。
図1-1に、Oracle 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フレームワークからトランザクション・マネージャが呼び出されます。Interoperable Naming Service(INS)ブートストラップ処理メカニズムが使用されているCORBAサービスを使用する場合は、次の方法で基本的なトランザクションを使用します。
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の詳細は、CORBAプログラミング・リファレンスのCORBAブートストラップ処理のプログラミング・リファレンスに関する項を参照してください。 |
TransactionsサンプルCORBAアプリケーションでは、コースの登録のオペレーションがトランザクションのスコープ内で実行されます。Transactionsサンプル・アプリケーションで使用されるトランザクション・モデルは、会話型モデルと、単一クライアントの呼出しでデータベースの複数の個別オペレーションが呼び出されるモデルを組み合せたものです。
Transactionsサンプル・アプリケーションは、以下のように機能します。
TooManyCredits
ユーザー例外がサーバー・アプリケーションからクライアント・アプリケーションに返されます。続いて、クライアント・アプリケーションによって、リクエストが拒否されたという内容の簡単なメッセージが表示されます。その際、クライアント・アプリケーションはトランザクションをロールバックします。 図1-2では、Transactionsサンプル・アプリケーションのしくみを示しています。
Transactionsサンプル・アプリケーションは、次の2とおりの方法でトランザクションをロールバックします。
したがって、Transactionsサンプル・アプリケーションでも、ユーザー定義のCORBA例外を実装する方法が示されています。たとえば、学生が登録可能なコースの最大数を超えているコースに登録を試行すると、サーバー・アプリケーションは、TooManyCredits
例外を返します。クライアント・アプリケーションは、この例外を受け取ると、自動的にトランザクションをロールバックします。
注意: | Oracle Tuxedo CORBAアプリケーションにトランザクションを実装する方法の詳細は、Oracle Tuxedoオンライン・ドキュメントのトランザクションのサンプルに関する項を参照してください。 |
このトピックでは、トランザクション処理コードを含むOracle Tuxedoアプリケーションを記述するための次の開発手順を説明します。
この開発手順では、Transactionsサンプル・アプリケーションを例にあげて説明します。Transactionsサンプル・アプリケーションのソース・ファイルは、Oracle Tuxedoソフトウェアの\samples\corba\university
ディレクトリにあります。Transactionsサンプル・アプリケーションのビルドと実行の詳細は、Oracle Tuxedoオンライン・ドキュメントのトランザクションのサンプルに関する参照してください。
他の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
{
//Returns a list of length 0 if there are no more entries
CourseSynopsisList get_next_n(
in unsigned long number_to_get, // 0 = return all
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;
}
//Classes restricted to same time block on all scheduled days,
//starting on the hour
struct ClassSchedule
{
Days class_days; // bitmask of days
unsigned short start_hour; // whole hours in military time
unsigned short duration; // minutes
};
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;
};
//The Registrar interface is the main interface that allows
//students to access the database.
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
);
};
// The RegistrarFactory interface finds Registrar interfaces.
interface RegistrarFactory
{
Registrar find_registrar(
);
};
トランザクション・ポリシーは、インタフェースごとに使用されます。設計時に、Oracle Tuxedoアプリケーション内のどのインタフェースでトランザクションを処理するかを決定します。表1-1では、CORBAトランザクション・ポリシーを説明しています。
開発中に、トランザクション・ポリシーを割り当てることで、トランザクション内で実行するインタフェースを決定します。トランザクション・ポリシーは、実装構成ファイル(ICF)で指定しhます。テンプレートのICFファイルは、genicf
コマンドで作成します。ICFの詳細は、CORBAプログラミング・リファレンスの実装構成ファイル(ICF)に関する項を参照してください。
Transactionsサンプル・アプリケーションでは、Registrar
インタフェースのトランザクション・ポリシーがalways
に設定されます。
サーバー・アプリケーションでトランザクションを使用する場合は、インタフェースの操作を実装するメソッドを記述する必要があります。Transactionsサンプル・アプリケーションでは、register_for_courses()
操作のメソッド実装を記述します。
Oracle Tuxedoアプリケーションでデータベースを使用する場合は、XAリソース・マネージャをオープンおよびクローズするサーバー・アプリケーション・コードを含める必要があります。それらの操作は、ServerオブジェクトのServer::initialize()
操作とServer::release()
操作に含められます。リスト1-2に、XAリソース・マネージャをオープンおよびクローズするTransactionsサンプル・アプリケーションのServerオブジェクトのコードの一部を示します。
注意: | トランザクションを実装するCORBAサーバー・アプリケーションの完全な例は、Oracle Tuxedoオンライン・ドキュメントのトランザクションのサンプルに関する項を参照してください。 |
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();
}
//Utilities to manage transaction resource manager
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//cleanup not necessary
}
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ブートストラップ処理メカニズムの使用方法の詳細は、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());//Begin the transaction
var_transaction_current_oref->begin();
try {
//Perform the operation inside the transaction
pointer_Registar_ref->register_for_courses(student_id, course_number_list);...
//If operation executes with no errors, commit the transaction:CORBA::Boolean report_heuristics = CORBA_TRUE;
var_transaction_current_ref->commit(report_heuristics);
}
catch (...) {
//If the operation has problems executing, rollback the
//transaction. Then throw the original exception again.
//If the rollback fails, ignore the exception and throw the
//original exception again.
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
トランザクション・ログおよび構成ファイルのパラメータ定義の詳細は、「トランザクションの管理」を参照してください。
![]() ![]() ![]() |