![]() |
![]() |
![]() |
![]() |
![]() |
このマニュアルの各章では、様々なOracle Tuxedoソフトウェア機能を活用するCORBAサーバー・アプリケーションをビルドする手順および例について説明します。Oracle Tuxedo CORBAサーバー・アプリケーションとその動作のバックグラウンド情報は、『Oracle Tuxedo CORBAアプリケーション・スタート・ガイド』を参照してください。また、IDLコンパイラによって生成され、CORBAサーバー・アプリケーションに組み込む複数のファイルも使用します。これらのファイルとその説明は、第2章「Oracle Tuxedo CORBAサーバー・アプリケーションの作成手順」を参照してください。以降の項では、これらのエンティティの概要を説明します。これらのコンポーネントの生成方法の詳細は、第2章「Oracle Tuxedo CORBAサーバー・アプリケーションの作成手順」を参照してください。OMG IDLの詳細は、『CORBAクライアント・アプリケーションの作成』を参照してください。クライアント・アプリケーションは、サーバー・アプリケーションによって管理されるCORBAオブジェクトのオブジェクト参照を介して、それらのオブジェクトをアクセスおよび操作します。クライアント・アプリケーションは、オブジェクト参照上の操作(つまりリクエスト)を呼び出します。これらのリクエストはメッセージとしてサーバー・アプリケーションに送信されます。サーバー・アプリケーションは、CORBAオブジェクトの適切な操作を呼び出します。これらのリクエストがサーバー・アプリケーションに送信され、そのサーバー・アプリケーションで呼び出されるという事実は、クライアントからは完全に見えません。クライアント・アプリケーションは、単にクライアント・スタブで呼出しを行っているように見えます。一般に、CORBAオブジェクトへのオブジェクト参照はファクトリによってOracle Tuxedoシステムで作成されます。ファクトリは、別のCORBAオブジェクトへの参照をその操作の1つとして戻す任意のCORBAオブジェクトです。アプリケーションのファクトリは、アプリケーション用に定義した他のCORBAオブジェクトと同じように実装します。ファクトリをFactoryFinderに登録することによって、ファクトリをOracle Tuxedoドメイン、およびそのOracle Tuxedoドメインに接続されているクライアントに認識させることができます。ファクトリの登録は、通常、1-7ページの「サーバー・オブジェクト」という項で説明されているサーバー・オブジェクトによって実行される操作です。ファクトリの設計の詳細は、1-8ページの「オブジェクト参照の生成」という項を参照してください。
•
• グループIDは、クライアント・アプリケーションがオブジェクト参照を使用してリクエストを行ったときに、そのオブジェクト参照のルーティング先となるサーバー・グループを識別します。デフォルト以外のグループIDの生成は、8-11ページの「ファクトリ・ベース・ルーティング」という項で説明されているファクトリ・ベース・ルーティングというOracle Tuxedoの主要機能の1つです。ファクトリ・ベース・ルーティングの詳細は、-11ページの「ファクトリ・ベース・ルーティング」という項を参照してください。TP::create_active_object_reference()操作で作成されたオブジェクト参照は、それを作成したサーバー・プロセスの存続期間のみ有効です。詳細は、3-15ページの「状態を持つオブジェクトの事前アクティブ化」という項を参照してください。サーバー・アプリケーションが、サーバー・マシンのメモリーにマップされていないオブジェクト(アクティブでないオブジェクト)に対するリクエストを受信した場合、TPフレームワークはServer::create_servant()操作を呼び出します。Server::create_servant()操作は、作成するCORBAサーバー・アプリケーションのコンポーネントであるサーバー・オブジェクト(1-2ページの「サーバー・アプリケーション用のCORBAオブジェクトの実装」という項を参照)で実装されます。Server::create_servant()操作により、CORBAオブジェクト実装のインスタンスがサーバー・マシンのメモリーにマップされます。このオブジェクト実装のインスタンスを、オブジェクトのサーバントと呼びます。正式には、サーバントとはアプリケーションのOMG IDLファイルに定義されるインタフェースを実装するC++クラスのインスタンスです。サーバントは、Server::create_servant()操作に記述するC++ new文によって生成されます。オブジェクトのサーバントが作成されたら、TPフレームワークはそのサーバントのTobj_ServantBase::activate_object()操作を呼び出します。Tobj_ServantBase::activate_object()操作は、すべてのオブジェクト実装クラスが継承するTobj_ServantBaseベース・クラスで定義される仮想操作です。TPフレームワークは、Tobj_ServantBase::activate_object()操作を呼び出してサーバントをオブジェクトID (OID)に関連付けます。(反対に、TPフレームワークがTobj_ServantBase::deactivate_object()操作を呼び出すと、サーバントとOIDとの関連付けが解除されます。)オブジェクトのデータがディスク上に存在し、CORBAオブジェクトをアクティブ化するときにそのデータをメモリーに読み取る場合、そのオブジェクトのTobj_ServantBase::activate_object()操作を定義および実装することによってそのデータを読み取ることができます。Tobj_ServantBase::activate_object()操作には、オブジェクトの永続的な状態をメモリーに読み取るために必要な特定の読取り操作を格納できます。(かわりに、実装ファイルにコーディングしたオブジェクトに対する1つまたは複数の操作によってオブジェクトのディスク・データをメモリーに読み込むこともできます。詳細は、1-14ページの「オブジェクトのデータの読取りと書込み」という項を参照してください。)Tobj_ServantBase::activate_object()操作の呼出しが完了したら、オブジェクトはアクティブ化されていると見なされます。サーバント・プールを使用すると、CORBAサーバー・アプリケーションはサーバントと特定のOIDとの関連付けが解除された後でも、サーバントをメモリーに格納し続けることができます。プールされたサーバントで処理できるクライアント・リクエストが到着すると、TPフレームワークはTP::create_servant操作をバイパスし、プールされたサーバントとクライアント・リクエストで提供されたOIDの間にリンクを作成します。このため、サーバント・プールを使用すると、CORBAサーバー・アプリケーションは、サーバントによって処理できるオブジェクト・リクエストが到着するたびにそのサーバントを再インスタンス化するコストを最小限に抑えることができます。サーバント・プールおよびその使用方法の詳細は、2-25ページの「サーバント・プール」という項を参照してください。
• 基本的なサーバー・アプリケーション初期化操作の実行(これには、サーバー・アプリケーションによって管理されるファクトリの登録や、サーバー・アプリケーションで必要なリソースの割当てが含まれます)。サーバー・アプリケーションがトランザクションに関与する場合、ServerオブジェクトはXAリソース・マネージャをオープンするコードを実装します。一般的なテキスト・エディタを使用してサーバー・オブジェクトを最初から作成します。作成したサーバー・オブジェクトは、サーバー・アプリケーションのビルド・コマンド、buildobjserverへの入力として提供します。サーバー・オブジェクトの作成の詳細は、第2章「Oracle Tuxedo CORBAサーバー・アプリケーションの作成手順」を参照してください。
• Oracle Tuxedoドメインで管理されるファクトリクライアント・アプリケーションは、Bootstrapオブジェクトを使用してOracle Tuxedoドメイン内の特定のオブジェクト・セット(FactoryFinderオブジェクトやSecurityCurrentオブジェクトなど)の初期参照を解決します。Bootstrapオブジェクトの詳細は、『Oracle Tuxedo CORBAアプリケーション・スタート・ガイド』および『CORBAクライアント・アプリケーションの作成』を参照してください。従来のオブジェクト参照に関連付けられているオブジェクトは、クライアント・アプリケーションがそのオブジェクトに対して呼出しを行うまでインスタンス化されませんが、アクティブ・オブジェクト参照に関連付けられているオブジェクトは、そのアクティブ・オブジェクト参照の作成時に作成され、アクティブ化されます。アクティブ・オブジェクト参照は、イテレータ・オブジェクトなど、特定の目的の場合に特に便利です。アクティブ・オブジェクト参照の詳細は、3-15ページの「状態を持つオブジェクトの事前アクティブ化」という項を参照してください。Oracle Tuxedoドメインでは、オブジェクト状態は、オブジェクトに対する複数のクライアント呼出しにわたる、そのオブジェクトのプロセス状態を表します。Oracle Tuxedoソフトウェアでは、表1-1に示すステートフル・オブジェクトとステートレス・オブジェクトの定義を使用します。
表1-1 オブジェクト状態について
• オブジェクトによる自身のTP::deactivateEnable()操作の呼出し。状態管理にはオブジェクトがアクティブである期間も含まれ、これは、サーバーのパフォーマンスおよびマシン・リソースの使用に重要な影響を与えます。アクティブ化されたオブジェクトの有効期間は、オブジェクトのインタフェースに割り当てるオブジェクトのアクティブ化ポリシーによって指定されます。オブジェクトのアクティブ化ポリシーについては、次の項で説明します。最適なアプリケーション・パフォーマンスを実現するには、アプリケーションのオブジェクトで状態を管理する方法を慎重に計画する必要があります。オブジェクトは、永続ストレージ(該当する場合)に状態を保存してから、非アクティブ化する必要があります。また、オブジェクトは、アクティブ化する際に永続ストレージ(該当する場合)の状態を復元する必要があります。オブジェクト状態情報の読取りと書込みの詳細は、1-14ページの「オブジェクトのデータの読取りと書込み」という項を参照してください。
注意: Oracle Tuxedoリリース8.0以降では、パフォーマンスの拡張を目的としてパラレル・オブジェクトがサポートされます。この機能を使用すると、特定のアプリケーション内のすべてのビジネス・オブジェクトをステートレス・オブジェクトとして指定できます。詳細は、『CORBAプログラミング・リファレンス』の第3章「TPフレームワーク」を参照してください。表1-2に、3つのポリシーとその説明を示します。
表1-2 オブジェクトのアクティブ化ポリシー 操作が呼び出されたときにオブジェクトをアクティブ化します。オブジェクトがトランザクションのスコープ内でアクティブ化された場合、そのオブジェクトはトランザクションがコミットまたはロールバックされるまでは、アクティブ化されたままです。オブジェクトがトランザクションのスコープの外でアクティブ化された場合、その動作はメソッド・バウンド・オブジェクトと同じです。このアクティブ化ポリシーが適用されるオブジェクトを、トランザクション・バウンド・オブジェクトと呼びます。
• このオブジェクトの操作によってTP::deactivateEnable()操作が呼び出され、その結果このオブジェクトが非アクティブ化されました。(これは、アプリケーション制御の非アクティブ化と呼ばれるOracle Tuxedoの主要機能の一部。詳細は、-13ページの「アプリケーション制御の非アクティブ化」という項を参照。)オブジェクトのアクティブ化ポリシーを割り当てて、オブジェクトが非アクティブ化される原因となるイベントを決定します。オブジェクトのアクティブ化ポリシーをオブジェクトのインタフェースに割り当てる方法の詳細は、2-13ページの「ステップ4: メモリー内でのオブジェクトの振る舞いの定義」という項を参照してください。Oracle Tuxedoソフトウェアには、アプリケーション制御の非アクティブ化という機能も用意されています。この機能を使用すると、アプリケーションは実行時にオブジェクトを非アクティブ化できます。Oracle Tuxedoソフトウェアは、プロセス・バウンド・オブジェクトが自身に対して呼び出すことができるTP::deactivateEnable()操作を提供しています。TP::deactivateEnable()操作が呼び出されると、その操作が存在するオブジェクトは自身に対する現在のクライアント呼出しの完了時に非アクティブ化されます。オブジェクトは、自身に対してだけこの操作を呼び出すことができます。呼出しが行われれているオブジェクト以外のオブジェクトでこの操作を呼び出すことはできません。
注意: アプリケーション制御の非アクティブ化を使用して、クライアント・アプリケーションとサーバー・アプリケーションによって管理されるオブジェクト間の会話モデルを実装する場合、オブジェクトは最終的にTP::deactivateEnable()操作を呼び出す必要があります。呼び出さない場合、オブジェクトはメモリー内で永久的にアイドル状態に置かれます。これは、TP::deactivateEnable()操作の呼出し前にクライアント・アプリケーションがクラッシュした場合に危険を招くおそれがあります。一方、トランザクションはタイムアウト・メカニズムを実装して、オブジェクトが永久的にアイドル状態に置かれることを防ぎます。これは、2つの会話モデルのいずれかを選択する際のもう1つの考慮事項です。
1. 実装ファイルで、アプリケーション制御の非アクティブ化を使用するインタフェースの操作内の適切な位置にTP::deactivateEnable()操作の呼出しを挿入します。
2.
3. 2-16ページの「ステップ5: サーバー・アプリケーションのコンパイルとリンク」と2-16ページの「ステップ6: サーバー・アプリケーションのデプロイ」という項で説明するとおり、アプリケーションをビルドおよびデプロイします。サーバー・アプリケーションで管理されるCORBAオブジェクトの多くに、外部ストレージに格納されたデータがある場合があります。こうした外部に格納されているデータは、オブジェクトの恒久または永続状態とみなされます。オブジェクト状態管理が適切に機能するには、オブジェクト実装の適切なポイントで永続状態を処理する必要があります。
TPフレームワークは、オブジェクトのサーバントの作成後に、そのサーバントに対してTobj_ServantBase::activate_object()操作を呼び出します。1-6ページの「CORBAオブジェクトの実行時のインスタンス化」という項で説明したように、この操作はクライアント/サーバー・アプリケーション用に定義するすべてのCORBAオブジェクトが継承するTobj_ServantBaseベース・クラスで定義されます。オブジェクトのTobj_ServantBase::activate_object()操作を定義および実装しないことを選択することもできます。この場合、TPフレームワークがオブジェクトをアクティブ化したときに特定のオブジェクト状態の処理に関しては何も発生しません。ただし、この操作を定義および実装する場合、オブジェクトの永続状態の一部または全部をメモリーに読み取るコードを操作に組み込むことができます。このため、Tobj_ServantBase::activate_object()操作を使用すると、サーバー・アプリケーションには、オブジェクトの永続状態をメモリーに読み取るための最初の機会が与えられます。オブジェクトのOIDにデータベース・キーが含まれている場合、Tobj_ServantBase::activate_object()操作はそのキーをOIDから抽出するための唯一の手段を提供します。Tobj_ServantBase::activate_object()操作の実装の詳細は、2-5ページの「ステップ2: 各インタフェースの操作を実装するメソッドの記述」を参照してください。Tobj_ServantBase::activate_object()操作の実装の例は、第3章「Basic CORBAサーバー・アプリケーションの設計と実装」を参照してください。
オブジェクトがTPフレームワークによって非アクティブ化される場合、TPフレームワークはオブジェクト非アクティブ化の最終ステップとしてこの操作を呼び出します。Tobj_ServantBase::activate_object()操作と同様、Tobj_ServantBase::deactivate_object()操作もTobj_ServantBaseクラスで定義されます。オブジェクトのdeactivate_object()操作は、メモリーからフラッシュするか、またはデータベースに書き込む特定のオブジェクト状態が存在する場合にオプションで実装します。オブジェクトがメモリー内のデータを保持するか、任意の目的のためにメモリーを割り当てる場合、Tobj_ServantBase::deactivate_object()操作を実装してオブジェクトが最後にメモリーからデータをフラッシュできるようにします。オブジェクトの非アクティブ化前にメモリーから状態をフラッシュすることは、メモリー・リークを回避するために不可欠です。 一般に、メソッド・バウンド・オブジェクトとプロセス・バウンド・オブジェクトの場合、データベース書込み操作はこれらの操作の中で実行し、Tobj_ServantBase::deactivate_object()操作では実行しません。ただし、トランザクション・バウンド・オブジェクトの場合、Tobj_ServantBase::deactivate_object()操作で永続状態を書き込むと、トランザクション・サーバー・アプリケーションにとって意味のあるオブジェクト管理上の効率化が実現されます。
注意: Tobj_ServantBase::deactivate_object()操作を使用して永続状態をディスクに書き込む場合、ディスクへの書込み中に発生するエラーはクライアント・アプリケーションにはレポートされません。このため、この操作でデータをディスクに書き込む必要があるのは、オブジェクトがトランザクション・バウンドの場合(transactionアクティブ化ポリシーが割り当てられている場合)か、またはTransactionCurrentオブジェクトを呼び出すことによってトランザクション内でディスク書込み操作をスコープする場合です。トランザクション内でディスクへの書込み中に発生したエラーは、クライアント・アプリケーションにレポートできます。Tobj_ServantBase::deactivate_object()操作を使用してオブジェクト状態をディスクに書き込む方法の詳細は、2-25ページの「Tobj_ServantBase::deactivate_object()での状態処理に関する注意」という項を参照してください。オブジェクトのTobj_ServantBase::activate_object()操作を使用した永続状態の読取りは、次の条件のいずれかが存在するときに適しています。アクティブ化ポリシーに関係なく、どのオブジェクトを使用する場合も、そのデータを必要とする各操作で永続データを読み取ることができます。つまり、Tobj_ServantBase::activate_object()操作の外部で永続状態の読取りを処理します。この方法は、次の場合に適しています。次に、顧客の投資ポートフォリオを表すオブジェクトの例を示します。このオブジェクトには、投資ごとに複数の個別データが含まれます。特定の操作がポートフォリオの1つの投資のみに影響を与える場合、その操作を使用して1つのレコードを読み取る方が、オブジェクトを呼び出すたびに投資ポートフォリオ全体を自動的に読み取る汎用のTobj_ServantBase::activate_object()操作を使用するより効率的です。ステートレス・オブジェクト、つまり、methodアクティブ化ポリシーで定義されたオブジェクトの場合、次のことを保証する必要があります。TPフレームワークは、アクティブ化時にオブジェクトのTobj_ServantBase::activate_object()操作を呼び出します。オブジェクトが自身のディスク上の永続状態へのキーを含むOIDを持っている場合、Tobj_ServantBase::activate_object()操作はそのキーをOIDから抽出するための唯一の機会をオブジェクトに提供します。ステートレス・オブジェクトがトランザクションに参加できるようにする場合、一般に、そのオブジェクトの個々のメソッドの中でそのオブジェクトが永続状態をディスクに書き込むようにします。ただし、ステートレス・オブジェクトが常にトランザクションに関与する(このオブジェクトが呼び出されたときにトランザクションが常にスコープ指定される)場合、Tobj_ServantBase::deactivate_object()操作でデータベース書込み操作を処理することを選択できます。これは、データベース書込み操作を正確にコミットまたはロールバックするための信頼できるメカニズムがXAリソース・マネージャに用意されているからです。
注意: サーバント・プールは、ステートレス・オブジェクトに特に役立つ機能です。CORBAサーバー・アプリケーションによってサーバントがプールされると、クライアントがオブジェクトを呼び出すたびにオブジェクトをインスタンス化するコストを大幅に削減できます。-7ページの「サーバント・プール」という項で説明したとおり、プールされたサーバントは、そのクライアント呼出しの完了後もメモリーに保持されます。アプリケーションで特定のオブジェクトを繰り返し呼び出す可能性がある場合、サーバントをプールすると、各クライアントに対してオブジェクトのメソッドではなくデータだけをメモリーに読み取り、メモリーから書き込むだけで済みます。オブジェクトのメソッドをメモリーに読み取るコストが高い場合、サーバント・プールによってそのコストを低減できます。サーバント・プールを実装する方法の詳細は、2-25ページの「サーバント・プール」という項を参照してください。
• トランザクション・バウンド・オブジェクトの場合、トランザクションの結果がわかっているときには、Tobj_ServantBase::deactivate_object()操作が呼び出されるまで永続状態の書込みを延期できます。前項で説明したとおり、Tobj_ServantBase::deactivate_object()操作は、オブジェクトの永続状態をディスクに書き込むための手段として実装します。また、この操作は、保持されているオブジェクト・データをメモリーからフラッシュして、オブジェクトのサーバントでそのオブジェクトの別のインスタンスをアクティブ化できるようにするためにも使用されます。ただし、オブジェクトのTobj_ServantBase::deactivate_object()操作の呼出しによってそのオブジェクトのデストラクタも呼び出されると見なしてはなりません。
• すべての操作に共通の状態のみをTobj_ServantBase::activate_object()操作で読み取ります。それ以外の状態の読取りは、それらを必要とする操作のみで行うようにします。一般的な最適化の方法は、アクティブ化時にdirtyStateフラグを初期化し、オブジェクトのアクティブ化中にこのフラグが変更された場合にのみTobj_ServantBase::deactivate_object()操作でデータを書き込むことです。(ただし、これはオブジェクトが常に同じサーバント・プロセスでアクティブ化されると保証できる場合にだけ使用できます。)オブジェクトがアクティブ化されるときに行われる一連のアクティビティの例については、『Oracle Tuxedo CORBAアプリケーション・スタート・ガイド』を参照してください。Process-Entityデザイン・パターンは、大規模なエンタープライズ・クラスのクライアント/サーバー・アプリケーションに適用されます。このデザイン・パターンは、『Object-Oriented Design Patterns』(Gamma他著)ではFlyweightパターンと呼ばれ、他の出版物ではモデル/ビュー/コントローラと呼ばれています。
• 細粒度オブジェクトを実装せずに細粒度オブジェクトのメリットを実現できます。かわりに、CORBAのstructデータ型を使用して、オブジェクトをシミュレートします。Process-Entityデザイン・パターンの適用例については、第3章「Basic CORBAサーバー・アプリケーションの設計と実装」を参照してください。Process-Entityデザイン・パターンの詳細は、『テクニカル・アーティクル』を参照してください。