Oracle Containers for J2EE サービス・ガイド 10g(10.1.3.1.0) B31858-01 |
|
この章では、Oracle Containers for J2EE(OC4J)のトランザクション・サポートについて説明します。この章には、次の項目が含まれます。
この章では、次のトランザクション管理タスクについて説明します。
次のOC4Jトランザクション・サポートの機能および動作は、今回のリリースの新機能です。
次の項目は、今回のリリースで廃止予定であり、将来的にはサポートされなくなります。
次の項目は、今回のリリースではサポートされません。
本番環境でOC4Jを使用する前に、次のタスクを実行することをお薦めします。
次のサイトにあるHow-Toドキュメントでは、OC4Jの機能に関する情報(各機能の概要や機能に関連するコードの抜粋など)を提供しています。
http://www.oracle.com/technology/tech/java/oc4j/1013/how_to/index.html
Java Transaction API(JTA)は、J2EE環境でグローバル(分散)トランザクションをサポートするためにSun社が開発した仕様です。グローバル・トランザクションでは、データベースやメッセージ・キューなどの複数のエンタープライズ・システムが単一の作業ユニットに統合されます。
JTAにより、Open Groupの分散トランザクション処理モデルに基づく仕様がJava環境にマップされます。Open GroupのXA仕様は、トランザクション・マネージャとリソース・マネージャ間のインタフェースを定義しています。JTA仕様は、アプリケーションとトランザクション・マネージャ間のインタフェースを定義しています。
JTA仕様は、http://java.sun.com/products/jtaで入手できます。
トランザクションは、状態の変化するシステムにおいて正確な出力結果を保証するためのメカニズムです。プログラマは、トランザクションを使用することで、システム内の多くの状態変化を単一の作業ユニットとして把握できます。JTAトランザクションは、リソースの登録およびトランザクション境界設定で構成されます。トランザクション・スコープ内で発生した変更は、コミットまたはロールバックできます。
一般的に、トランザクションは、アプリケーションによって開始されます。アプリケーションは、共有リソース(1つ以上のデータベース・システムなど)に対してなんらかの作業を実行し、そのトランザクションをコミットします。コンテナ管理のトランザクションの場合、トランザクションはアプリケーション・サーバーによって開始されます。
J2EEでのトランザクション処理の詳細は、次の書籍を参照してください。
Little、Maron、Pavlik著『Java Transaction Processing: Design and Implementation』(Prentice Hall、2004)
J2EEおよび多くの主要な情報管理システムによってサポートされるトランザクション・モデルは、次に示すACID特性を保持するよう設計されているのが普通です。
システムのインフラストラクチャ自体では、これらすべての特性を保証できないことに注意してください。一貫性の特性を確保するには、整合性のある変更をシステムに加えるアプリケーション・ロジックが必要です。たとえば、人事管理データベースに人ではなく惑星を表す識別子を挿入するトランザクション・ロジックがあるとすると、一貫性のない結果が出力されます(もっとも、アプリケーション・サーバーとデータベースで惑星名が意味のない値であると判別する方法はまずありませんが)。
ACIDを確保することで、インフラストラクチャとアプリケーションに負荷がかかることにも注意してください。ACIDのオーバーヘッドを抑える必要がある場合は、できるかぎり単一のローカル・リソースのみを使用し、2フェーズ・コミットを使用しないように作業を設計します。
今回のリリースでは、トランザクション調整機能はOC4Jに組み込まれています。置き換えられたデータベース内の調整機能は、廃止予定となっています。また、中間層コーディネータは、異機種間環境対応となり、OracleリソースだけでなくすべてのXA互換リソースをサポートします。
中間層コーディネータの機能は、次のとおりです。
図3-1「新規の中間層コーディネータと廃止予定のデータベース内コーディネータの比較」に、新規の中間層コーディネータと廃止予定のデータベース内コーディネータの違いを示します。
トランザクションの複雑さは、アプリケーションがトランザクション内に登録するリソースの数によって決まります。
ローカル・トランザクションには、1つのリソースのみが含まれます。トランザクション・アクティビティのスコープ設定と調整は、リソース自体に対してローカルに実行されます。ローカル・トランザクションでは、1フェーズ・コミット(1pc)プロトコルが使用されます。
グローバル・トランザクション(分散トランザクション)では、トランザクション内に複数のリソースが登録されます。たとえば、グローバル・トランザクションは、2つのデータベースを作業範囲とする場合に使用できます。グローバル・トランザクションをサポートするトランザクション処理システムには、通常、複数の異なる論理コンポーネント(トランザクション・ファクトリ、リソース・マネージャ、コーディネータ、アプリケーションなど)が含まれます。グローバル・トランザクションでは、結果の原子性を保証するため、2フェーズ・コミット(2pc)プロトコルという終了プロトコルが使用されます。
2フェーズ・コミット(2pc)プロトコルは、グローバル・トランザクションの複数の参加者が同意に至るためのメカニズムです。このプロトコルは、その名前が示すとおり、2つのフェーズに分けられます。最初のフェーズは、通常、投票フェーズと呼ばれます。各参加者は、トランザクション作業をコミットする準備ができているかどうかを尋ねられます。作業をコミットできる参加者は、コミット可能であるという投票メッセージをコーディネータに送信します。
投票の結果、トランザクションのコミット準備ができていない参加者が1つでも存在する場合は、すべての参加者がロールバックの指示を受けます。
ACID特性を保証するため、一部のトランザクション・システムでは、2フェーズ・コミット・プロトコルと2フェーズ・ロック・プロトコルを組み合せています。具体的には、準備フェーズが開始すると、トランザクション内で作業を実行できなくなります。
2フェーズ・コミット・プロトコルでは、システム障害時に結果の原子性を保証するため、トランザクション・マネージャでトランザクションの進捗状況を記録する必要があります。
各リソースは、トランザクションのスコープ内で使用されるときに、アプリケーション・サーバーによって自動的に登録されます。ただし、2フェーズ・コミット・トランザクションでACID特性を保証するには、参加するすべてのリソースがXAに準拠している必要があります(最終リソース・コミットによる最適化の場合を除く)。
最終リソース・コミットでは、XAに準拠しない単一のリソースがXAトランザクションに参加できます。XAに準拠しない複数のリソースをトランザクションに登録すると、登録試行時に例外がスローされます。
準備フェーズでは、すべてのXA準拠リソースが準備を行います。すべてのXAリソースが準備OKの通知を戻すと、コーディネータは、XAに準拠しないリソースに制御を移します。XAに準拠しないリソースがコミット終了の通知を戻した場合、コーディネータはコミット決定をログに記録し、そうでない場合はロールバック決定を記録します。次に、コーディネータは、すべてのXAリソースにその決定を通知します。
最終リソース・コミットによる最適化では、単一の1フェーズ・コミット・リソースのみが特定のトランザクションへの登録を許可されるため、OC4Jでは、1フェーズ・コミット・リソースの登録をルートOC4Jプロセスに制限しています。1フェース・コミット・リソースをOC4Jの下位プロセスで登録しようとすると、サーバーがリソースを登録できなかったという例外がスローされます。この制限が必要とされる理由は、最終リソース・コミットによる最適化を使用する場合、1フェーズ・コミット・リソースの登録を下位プロセスに許可すると、グローバル・トランザクション・ツリーに登録されている1フェーズ・コミット・リソースが1つのみであることを保証する処理でオーバーヘッドが発生するためです。
注意
|
最終リソース・コミットを使用するには、トランザクション・マネージャで永続ストアを構成してトランザクション・ロギングを有効化します。永続ストア(およびロギング)は、デフォルトでは無効化されています。「トランザクション・コーディネータの構成」を参照してください。
単一の非XAリソースによるグローバル・トランザクションへの参加が可能になると同時に、最終リソース・コミットは、最適化の手段としても使用できます。XA準拠リソースを非XAリソースとして登録し、最終リソース・コミットを使用すると、パフォーマンスが向上します。これは、リソースでロギングを実行する必要がなくなり、コーディネータのリソースに対するコールが2つではなく1つのみとなってネットワーク・コールが減少するためです。また、リソースが不明(インダウト)状態とならないため、リソースのロックを防ぐことができます。ただし、最終リソース・コミットは、パフォーマンスの最適化に使用できますが、かわりに正確さの保証は失われます。
OC4Jの最終リソース・コミット機能の詳細は、『Oracle Containers for J2EEリソース・アダプタ管理者ガイド』の「トランザクション管理」の章を参照してください。
リソース・マネージャは、共有リソースの管理を担当します。リソース・マネージャの一般的な例は、リレーショナル・データベース・システムです。
トランザクション・マネージャは、トランザクション・ファクトリとコーディネータの両方の役割を担います。アプリケーションは、トランザクション・マネージャと通信して、トランザクションの開始と終了およびリソースの登録を行います。アプリケーションがトランザクションのコミットをリクエストすると、トランザクション・マネージャは、2フェーズ・コミット・プロトコルを調整します。
全体の一致を必要とするため、2フェーズ・コミットは、ブロック・プロトコルです。つまり、最終フェーズのメッセージを配信する前にコーディネータで障害が発生した場合、各参加者は、ブロックされた状態のままリソースを保持する必要があります。最新のトランザクション・システムでは、このような参加者がコミットまたはロールバックの実行を一方的に決定できるように、2フェーズ・コミットにヒューリスティック(経験則)機能が追加されています。ある参加者の決定が、最終的に別の参加者の決定と一致しなかった場合、原子性に欠ける動作が発生します。通常、これらの決定は、管理的な操作により実行されます。詳細は、「手動によるコミットおよびロールバック操作」を参照してください。
Synchronizationは、トランザクションに登録され、2フェーズ・コミット・プロトコルの実行前後に通知されるオブジェクトです。たとえば、アプリケーションは、独自の状態を保持しており、必要に応じて(またはトランザクション完了前に)キャッシュをリソースに永続化して、完了後はリソースを解放するのが普通です。
Synchronizationは、UserTransaction
インタフェースからは使用できないため、アプリケーションではSynchronizationを直接登録できません。この操作は、アプリケーション・サーバーでのみ実行できます。CMPの場合は、永続性レイヤーがこの操作を処理します。
EJBの詳細は、『Oracle Containers for J2EE Enterprise JavaBeans開発者ガイド』を参照してください。
Enterprise JavaBeansでは、コンテナ管理のトランザクションまたはBean管理のトランザクションを通じたトランザクション管理に、JTA 1.0.1Bを使用します。
コンテナ管理のトランザクションは、コンテナによって制御されます。つまり、コンテナは、デプロイメント・ディスクリプタ内の定義に従って、既存のトランザクションと結合するか、アプリケーション用に新しいトランザクションを起動します。新規に作成されたトランザクションは、Beanメソッドが完了すると終了します。トランザクションを管理するために、実装でコードを提供する必要はありません。
Bean管理のトランザクションは、Bean実装内でプログラムによって境界設定されます。トランザクション境界は、アプリケーションによって完全に制御されます。
トランザクションの境界設定とは、トランザクションの開始と終了の区切りを意味します。
トランザクション境界をユーザー自身が設定するには、BeanをBean管理のトランザクションとして指定します。トランザクション境界の設定をコンテナに任せるには、EJBデプロイメント・ディスクリプタにトランザクション属性を設定して、Beanをコンテナ管理のトランザクションとして指定します。
コンテナ管理のトランザクションは、すべてのEJBで使用できます。ただし、Bean管理のトランザクションは、セッションBeanとメッセージドリブンBean(MDB)でのみ使用できます。つまり、データ・アクセス用に設計されているエンティティBeanでは、コンテナ管理のトランザクションによる境界設定を使用する必要があります。セッションBeanでは、どちらのモデルも使用できます。
境界設定のタイプは、Beanのデプロイメント・ディスクリプタに指定します。次の例に、<transaction-type>
要素にContainer
と指定して、セッションBeanをコンテナ管理のトランザクションとして宣言する方法を示します。Beanを構成してBean管理のトランザクション境界を設定するには、<transaction-type>
要素にBean
と指定します。
</session> <description>no description</description> <ejb-name>myEmployee</ejb-name> <home>cmtxn.ejb.EmployeeHome</home> <remote>cmtxn.ejb.Employee</remote> <ejb-class>cmtxn.ejb.EmployeeBean</ejb-class> <session-type>Stateful</session-type> <transaction-type>Container</transaction-type> <resource-ref> <res-ref-name>jdbc/OracleMappedDS</res-ref-name> <res-type>javax.sql.DataSource</res-type> <res-auth>Application</res-auth> </resource-ref> </session>
コンテナ管理のトランザクション(CMT)を使用するようにBeanを定義する場合、後述の例に示すとおり、コンテナによるBeanのJTAトランザクションの管理方法を、Beanのデプロイメント・ディスクリプタの<trans-attribute>
要素に指定する必要があります。次の表に、トランザクション属性の設定とその説明を示します。
次の例に、EJBデプロイメント・ディスクリプタの<container-transaction>
部分を示します。この例では、myEmployee
EJBのすべての(*
)メソッドに対してRequiresNew
トランザクション属性を指定しています。
<assembly-descriptor> <container-transaction> <description>no description</description> <method> <ejb-name>myEmployee</ejb-name> <method-name>*</method-name> </method> <trans-attribute>RequiresNew</trans-attribute> </container-transaction> </assembly-descriptor>
トランザクションの開始、コミットまたはロールバックにBean実装は必要ありません。これらの操作は、デプロイメント・ディスクリプタに指定したトランザクション属性に基づいて、コンテナによって処理されます。
Webコンポーネント(JSPおよびサーブレット)と、ステートレスおよびステートフル・セッションBeanでは、プログラムによるトランザクション境界設定を使用できます。エンティティBeanでは、この方法は使用できないため、コンテナ管理によるトランザクション境界設定を使用する必要があります。
デプロイメント・ディスクリプタの<transaction-type>
要素内でBeanをBean管理のトランザクション(BMT)として宣言する場合、グローバル・トランザクションの開始、コミットまたはロールバックの境界は、Bean実装によって設定する必要があります。
Bean管理の(プログラムによる)トランザクション境界設定を使用する場合、Bean開発者は、UserTransaction
インタフェースを使用してグローバル・トランザクション境界を設定するか、RM固有のメソッドを使用してRMのローカル・トランザクション境界を設定することが可能です。
WebコンポーネントまたはBeanの開発者は、次の例に示すとおり、UserTransaction
インタフェースのbegin()
、commit()
およびrollback()
メソッドを明示的に発行する必要があります。
Context initCtx = new Initial Context(); ut = (UserTransaction) initCtx.lookup("java:comp/UserTransaction"); ut.begin(); // Do work. try { // Commit the transaction. ut.commit(); // Handle exceptions. Should really catch specific exceptions, not Exception } catch (Exception ex) { }
初期コンテキストを作成するかわりに、@Resource
注釈を使用してリソース・インジェクションをリクエストすることも可能です。そのような場合、ルックアップは実行時に自動的に行われます。次に例を示します。
@Resource begin(); // Do work. try { // Commit the transaction. commit(); // Handle exceptions. Should really catch specific exceptions, not Exception } catch (Exception ex) { }
この項では、2PCトランザクション・コーディネータの構成方法を説明します。この項には、次の項目が含まれます。
トランザクション・コーディネータは、Oracle Enterprise Manager 10g Application Server Controlコンソールまたはトランザクション・マネージャの構成ファイル(J2EE_HOME/config/transaction-manager.xml
)を使用して構成されます。この項では、コンソールを使用する方法を主に説明します。
トランザクション・コーディネータは、トランザクション・マネージャ・タスクまたはJTAResource
MBeanを使用して定義できます。どちらもApplication Server Controlコンソールの「管理」タブからアクセスできます。
トランザクション・コーディネータの構成時には、変更内容を反映するためにサーバーを再起動する必要があります。また、停止前にすべてのトランクションをパージする必要があります。パージされていないトランザクションがある場合、サーバーは、それが管理者により解決されるまで待機します。トランザクション中にサーバーが強制的に停止され、インダウト状態が続いている場合、構成の変更は保存されません。
トランザクション・マネージャ・タスクを使用してトランザクション・コーディネータを構成するには、次のようにします。
JTAResource
MBeanを使用してトランザクション・コーディネータを構成するには、次のようにします。
パラメータ | 説明 |
---|---|
|
2フェーズ・コミット・コーディネータのタイプ( データベース内コーディネータの使用は、OC4Jでは推奨されていません。今後は、中間層コーディネータを使用することをお薦めします。詳細は、「データベース内トランザクション・コーディネータの考慮事項」を参照してください。 |
|
ログ・タイプ( |
|
ログの場所。ファイルの場合はディレクトリ・パスを、データベース・ロギングの場合はJNDIロケーションを指定します。 |
|
データベース・ユーザー名。 |
|
データベース・パスワード。 |
|
コーディネータがリソース・マネージャに対して同期的にコマンドを再試行する回数(有効な場合)。再試行は、たとえばリソース・マネージャが |
トランザクション・コーディネータには、実行時のパフォーマンスの制御に使用される属性が複数含まれています。属性への変更はすぐに反映されるため、サーバーの再起動は不要です。
トランザクション・コーディネータには、トランザクション・マネージャ・タスクまたはJTAResource
MBeanを使用して定義できる属性が2つあります。表3-3で、汎用属性を説明します。
属性 | 説明 |
---|---|
transactionTimeout |
デフォルトのトランザクション・タイムアウト(秒単位)。 |
|
システム例外をスローせずに実行できるサーバー内の同時トランザクションの最大数。( |
ファイル・ストア・ログの属性は、トランザクション・コーディネータのファイル・ストア・ロギングを使用している際に、ファイル・ストアのパフォーマンスの制御に使用されます。属性を変更するには、JTAResource
MBeanを使用するか、transaction-manager.xml
ファイルを手動で編集する必要があります。表3-4で、ファイル・ストア・ログの属性を説明します。
データベース・ストア・ログの属性は、トランザクション・コーディネータのデータベース・ストア・ロギングを使用している際に、データベース・ストアのパフォーマンスの制御に使用されます。属性を変更するには、JTAResource
MBeanを使用するか、transaction-manager.xml
ファイルを手動で編集する必要があります。表3-4で、ファイル・ストア・ログの属性を説明します。
トランザクション・コーディネータでは、実行時の設定に応じてリソースに関する追加の構成が必要な場合があります。
トランザクション・マネージャを構成するには、J2EE_HOME/config/server.xml
ファイルに次の要素を含める必要があります。
<transaction-manager-config path="./transaction-manager.xml"/>
server.xml
のリファレンス・ドキュメントは、『Oracle Containers for J2EE構成および管理ガイド』の付録B「OC4Jで使用される構成ファイル」の「OC4Jサーバー構成ファイル(server.xml)の概要」を参照してください。
実行時ユーザーにXAResource.recover権限を付与しない場合、J2EE_HOME/config/data-sources.xml
ファイルを使用して、データソースが2pcトランザクションに参加し、リカバリするために必要なリカバリ情報を指定します。
// <connection-pool name="cmt Connection Pool"> min-connections="10" max-connections="30" inactivity-timeout="30" <connection-factory factory-class="oracle.jdbc.xa.client.OracleXADataSource" user="scott" password="tiger" url="jdbc:oracle:thin:@localhost:1521:ORCL"> <xa-recovery-config> <password-credential> <username>system</username> <password>manager</password> </password-credential> </xa-recovery-config> </connection-factory> </connection-pool> <managed-data-source connection-pool-name="cmt Connection Pool" jndi-name="jdbc/cmt" name="cmt"/>
oc4j-ra.xml
ファイルでは、JMSコネクタや他の任意のコネクタが2pcトランザクションに参加し、リカバリするために必要なXA情報とリカバリ情報を指定します。
2フェーズ・コミット処理に参加するためには、XAConnectionFactory
を使用する必要があります。また、必要なXAResource.recover
コールを実行するパーミッションを実行時ユーザーに付与しない場合は、connection-factory
でxa-recovery-config
要素を定義する必要があります。
詳細は、『Oracle Containers for J2EEリソース・アダプタ管理者ガイド』の「トランザクション管理」の章と付録の「OC4Jリソース・アダプタ構成ファイル」を参照してください。
xa-recovery-config
要素の形式は、次のとおりです。
<connection-factory> ... <xa-recovery-config> <password-credential> <username>adapter_admin_user</username> <password>adapter_admin_pw</password> </password-credential> </xa-recovery-config> ... </connection-factory>
次のリストに、ベンダー固有のパーミッションの例を示します。RDBMSのリソース・マネージャに関連するパーミッションは、data-sources.xml
に指定します。
DBA_PENDING_TRANSACTIONS
に対するselect
権限とsys.dbms
システムに対するexecute
権限(リリース9.2以上のRDBMS)
sysadmin
ロール
execute
権限
sysadmin
ロール
この項では、データベース内の2フェーズ・コミット・コーディネータを使用するための要件について説明します。
データベース内の2フェーズ・コミット・エンジンは、次の項目で構成されます。
適切なOracleデータベースを2フェーズ・コミット・エンジンとして指定および構成する手順は、次のとおりです。
data-sources.xml
ファイルでマネージド・データソースを定義します。次の例は、data-sources.xml
ファイルでの定義です。
<connection-pool name="OracleCommitDS"> min-connections="10" max-connections="30" inactivity-timeout="30" <connection-factory factory-class="oracle.jdbc.xa.client.OracleXADataSource" user="scott" password="tiger" url="jdbc:oracle:thin:@localhost:1521:ORCL"> </connection-factory> </connection-pool> <managed-data-source connection-pool-name="Example Connection Pool" jndi-name="jdbc/OracleCommitDS" name="OracleCommitDS"/>
transaction-manager.xml
で次のように2フェーズ・コミット・エンジンのデータソースを参照します。
<database location="jdbc/OracleCommitDS"> <identity user-name="COORDUSR" password="COORDPW"/> </database>
identity
要素は、マネージド・データソースで指定したuser
とpassword
を上書きする必要がある場合にのみ使用します。
たとえば、トランザクションを調整するユーザーがCOORDUSRの場合、2フェーズ・コミット・エンジンとトランザクションに関連する各データベースに対する操作は、次のようになります。
CONNECT SYSTEM/MANAGER; CREATE USER COORDUSR IDENTIFIED BY COORDUSR; GRANT CONNECT, RESOURCE, CREATE SESSION TO COORDUSR; GRANT FORCE ANY TRANSACTION TO COORDUSR;
CREATE PUBLIC DATABASE LINK
コマンドを使用して、2フェーズ・コミット・エンジンからグローバル・トランザクションに関連する各データベースへと向かう完全修飾のパブリック・データベース・リンクを構成します。これらのリンクは、トランザクション終了時に、2フェーズ・コミット・エンジンが各データベースと通信するために必要です。これらのリンクにより、COORDUSR
は、関連するすべてのデータベースに接続できます。
Application Server Controlコンソールの「接続プール」ページまたはdata-sources.xml
ファイルでプロパティを追加します。
次の例は、data-sources.xml
ファイルでの定義です。
<connection-pool name="OracleDS1"> min-connections="10" max-connections="30" inactivity-timeout="30" <connection-factory factory-class="oracle.jdbc.xa.client.OracleXADataSource" user="scott" password="tiger" url="jdbc:oracle:thin:@host1:1521:ORCL"> <property name="dblink" value="DBLINK1.REGRESS.RDBMS.DEV.US.OLE.COM"/> </connection-factory> </connection-pool> <managed-data-source connection-pool-name="Example Connection Pool" jndi-name="jdbc/OracleDS1" name="OracleDS1"/> <connection-pool name="OracleDS2"> min-connections="10" max-connections="30" inactivity-timeout="30" <connection-factory factory-class="oracle.jdbc.xa.client.OracleXADataSource" user="scott" password="tiger" url="jdbc:oracle:thin:@host2:1521:ORCL"> <property name="dblink" value="DBLINK2.REGRESS.RDBMS.DEV.US.OLE.COM"/> </connection-factory> </connection-pool> <managed-data-source connection-pool-name="Example Connection Pool" jndi-name="jdbc/OracleDS2" name="OracleDS2"/>
この項では、実行時に可能となる次の操作について説明します。
「OC4J: ホーム」→「管理」タブ→「タスク名: JMX」→「システムMBeanブラウザ」→「タスクに移動」
Application Server Controlコンソールを通じてアクセス可能なJTAResource
MBeanの次の操作は、現在のトランザクションの結果を強制的に決定する場合に使用できます。
操作 | 説明 |
---|---|
|
インダウト・トランザクションに対する自律型のコミット決定 |
|
インダウト・トランザクションに対する自律型のロールバック決定 |
|
アクティブなトランザクションに対する自律型のsetRollbackOnly決定 |
この項では、JTAResource MBeanを通じて可能となる次の機能について説明します。
次の表にリストされた統計は、Application Server Controlコンソールを通じてアクセスできるJTAResource
MBeanにより提供されます。
次の表にリストされた属性は、JTAResource
MBeanにより提供されます。
次のJTAResource
MBean操作は、統計に関連しています。
JTAResource
MBeanでは、MBeanの「通知」タブに一連のイベント通知がリストされています。タブは、通知のサブスクライブにも使用できます。
また、Application Server Controlコンソールの「通知サブスクリプション」ページで通知にサブスクライブできます。
「OC4J: ホーム」→「管理」タブ→「タスク名: JMX」→「通知サブスクリプション」
通知は、Application Server Controlコンソールの「受信済の通知」ページで参照できます。
「OC4J: ホーム」→「管理」タブ→「タスク名: JMX」→「受信済の通知」
通常、システムが適切に構成されていれば、OC4Jまたは2PCトランザクションに参加するリソースのいずれかに障害が発生しても、引き続き元の状態に戻り、自動的にリカバリが行われます。
Application Server ControlコンソールのJTAResource
MBeanを使用すると、リカバリ中止ルールの定義やリカバリ・トランザクションの即時中止を含め、トランザクション・リカバリを管理できます。
JTAResource
MBeanの次の操作を使用して、トランザクション・リカバリを管理できます。
JTAResource
MBeanにも含まれているrecoveryRetryInterval
属性は、トランザクションのリカバリを試行するまでにリカバリ・マネージャが待機する時間(秒単位)の特定に使用されます。再試行は任意の中止定義の対象になります。属性は、デフォルトで300
秒に設定されます。
OPMN環境では、OC4Jに障害が発生すると、障害の発生したインスタンスのログを使用する新規インスタンスがOPMNによって起動されます。
スタンドアロン環境では、OC4Jインスタンスに障害が発生して、なんらかの理由でそのインスタンスを元の状態に戻すことができない(または戻してはならない)場合、別のOC4Jインスタンスにログを移行できます。
ログの移行プロセスは、インスタンスがルート・トランザクション・マネージャと介在トランザクション・マネージャのいずれであるか(またはその両方であるか)に応じて変化します。また、ロギング・メカニズムがファイルとデータベースのいずれであるかによっても変化します。
ファイル・ストアを使用するルート・トランザクション・マネージャの場合、新規OC4Jインスタンスのログ位置の構成を障害の発生したインスタンスのログ位置に変更するか、以前のログを手動で新規OC4Jインスタンスのログ位置に移動する必要があります。この作業は、宛先サーバーがオフラインであるか停止しているときに実行する必要があります。
ファイル・ストアを使用する介在トランザクション・マネージャの場合も同じプロセスを使用します。ただし、この介在トランザクション・マネージャの親トランザクション・マネージャは、以前の参照を新しいログ位置に更新する必要があります。この作業は、オフライン管理コマンドの-updateTransactionLogs
を使用して実行できます。
データベース・ストアを使用するルート・トランザクション・マネージャの場合、オフライン管理コマンドの-updateTransactionLogs
を使用して、oc4j_transaction
表のインスタンス・フィールドを更新することでログを移行します。新規OC4Jインスタンスで完全新規のデータベースを使用する場合は、ログ・ファイルをエクスポートおよびインポートする必要もあります。
データベース・ストアを使用する介在トランザクション・マネージャの場合も同じプロセスを使用します。ただし、この介在トランザクション・マネージャの親トランザクション・マネージャは、以前の参照を新しいログ位置に更新する必要があります。この作業は、オフライン管理コマンドの-updateTransactionLogs
を使用して実行できます。
admin.jar
では、次の2つのオフライン管理コマンドを使用できます。
-analyzeTransactionLogs
コマンドでは、トランザクション・ログ・ファイルのオフライン分析が可能になります。このユーティリティは、OC4Jが実行中の場合には使用しないでください(かわりにApplication Server Controlコンソールを使用します)。引数は次のとおりです。
引数 | 説明 |
---|---|
|
ストア・タイプ。 |
|
データベース・ロギング用の接続URL。 |
|
データベース・ロギング専用。 |
|
データベース・ロギング専用。 |
-updateTransactionLogs
コマンドでは、トランザクション・ログ・ファイルのオフライン更新が可能になります。このユーティリティは、OC4Jが実行中の場合には使用しないでください(かわりにApplication Server Controlコンソールを使用します)。引数は次のとおりです。
トランザクション・コンテキストの伝播により、複数のOC4Jインスタンスが単一のグローバル・トランザクションに参加できます。クライアントのトランザクションにおけるメソッド・サポートのスコープ決定作業がEJBのセマンティクスに含まれるすると、OC4Jインスタンスが既存のトランザクションのスコープ内にある別のOC4Jインスタンスにリモート・コールを行う場合、複数のOC4Jインスタンスが同じトランザクションに参加する必要があります。この例の1つは、次のようなOC4Jインスタンスのサーブレットです。
複数のOC4Jインスタンスが単一のトランザクションに参加する場合、それらのOC4Jインスタンスによりグローバル・トランザクションの一部として実行されるすべての作業は、その原子性が保証されます。
Remote Method InvocationがOC4Jインスタンス間で使用される場合、リクエスト側のOC4Jインスタンスは、現在のトランザクションを示すトランザクション・コンテキストを作成し、ORMIを通じたリモート・コールを使用してそのコンテキストを暗黙的に送信する必要があります。これにより、Remote Method Invocationを受信するOC4Jインスタンスは、リクエストの一部として実行する作業を、トランザクション・コンテキストで示されるトランザクションに関連付けることができます。リモートOC4Jインスタンスは、リクエスト側のOC4Jインスタンスにリソースとして登録されます。これにより、元のOC4Jインスタンスがルート・トランザクション・コーディネータとなり、子のOC4JインスタンスがノードとなるOC4Jインスタンスのツリーが作成されます。1つのOC4Jインスタンスは、親と子の両方になることが可能です。この場合、そのインスタンスは、親に対してはリソースとして振る舞い、子に対してはコーディネータとして振る舞います。これは、インターポジショニングと呼ばれます。ORMIの詳細は、第6章「Remote Method Invocationの使用方法」を参照してください。
ルート・コーディネータは、トランザクションをコミットすると、2フェーズ・コミット(2pc)プロトコルを実行し、登録されているOC4Jインスタンスを含むすべての登録済リソースに完了コールを送信します。ルート・コーディネータは、2フェーズ・コミット(2pc)プロトコルを使用してトランザクションの完了処理を制御しますが、下位のOC4Jインスタンスは、トランザクションの単なるリソースとして機能します。J2CA 1.5のトランザクション・インフロー規約を使用してOC4Jでトランザクションをインポートする場合のように、ルート・コーディネータは、OC4Jインスタンスではなく外部のコーディネータでもかまいません。リソースとして登録されたOC4Jインスタンスは、他の任意の登録済リソースと同じように振る舞い、自身のトランザクション・ブランチの準備とコミットのみを担当します。OC4Jインスタンスは、準備を指示するコールを受信すると、自身のすべての登録済リソースの準備を試行し、その結果を戻します。同様に、OC4Jインスタンスは、コミットを指示するコールを受信すると、自身のすべての登録済リソースに対してcommitをコールし、その結果を親に戻します。
トランザクション・インフロー規約の詳細は、『Oracle Containers for J2EEリソース・アダプタ管理者ガイド』の「インバウンド接続でのRAの使用方法」の章を参照してください。
ORMIを通じてOC4Jインスタンス間でトランザクションを伝播することにより、トランザクションを複数のOC4Jインスタンスに拡張できます。
次のサイトにあるHow-Toドキュメント「How-To Propagate a transaction context between OC4J instances」とZIPファイルには、OC4Jインスタンス間でのトランザクション・コンテキストの伝播に関する情報および使用例が含まれます。
http://www.oracle.com/technology/tech/java/oc4j/1013/how_to/how-to-transaction-propagation/doc/how-to-transaction-propagation.html
この項では、トランザクション伝播の構成に関する問題について説明します。
トランザクション伝播は、OC4Jではデフォルトで有効です。トランザクション伝播を無効化するには、システム・プロパティ-Drmi.disablePropagation=true
を設定します。このフラグの設定により、トランザクションおよびサブジェクトの伝播を含むすべてのコンテキスト伝播が無効化されます。トランザクション伝播の有効化または無効化は、サーバーにデプロイされているすべてのアプリケーションに影響します。粒度レベルを細かくすることはできません。トランザクション伝播の無効化は、慎重に行う必要があります。この設定については、リクエストに関連するすべてのOC4Jプロセスで必ず同じ構成にする必要があります。つまり、リクエストに関連するすべてのOC4Jプロセスで有効化するか、すべてのOC4Jプロセスで無効化します。これらの構成が混在すると(つまり、リクエストに関連するOC4Jプロセスの一部で有効化され、一部で無効化されると)、予期しない動作が発生する可能性があります。また、トランザクション伝播が無効化されると、複数のOC4Jプロセスは、単一のグローバル・トランザクションに参加できません。トランザクション伝播の無効化は、その結果をすべて完全に理解した場合にのみ行ってください。トランザクション伝播を無効化すると、問題が発生する可能性があるため、この機能は有効化しておくことをお薦めします。
OC4Jプロセスは、トランザクション・リソースとして機能することがあるため、障害時にリカバリ可能である必要があります。トランザクション・リカバリを容易にするため、各OC4Jプロセスでは、トランザクション・リカバリ時にトランザクション・リカバリ・マネージャによって使用されるパスワードを構成する必要があります。OC4Jに事前設定されているデフォルトのパスワードは、インストール後に変更する必要があります。
リカバリ・パスワードは、$J2EE_HOME/config
ディレクトリの構成ファイルjazn-data.xml
で構成します。トランザクション・リカバリ・パスワードを変更するには、jazn-data.xml
ファイルのJtaAdmin
ユーザーの資格証明値を変更します。
<user> <name>JtaAdmin</name> <display-name>JTA Recovery User</display-name> <description>Used to recover propagated OC4J transactions</description> <credentials>!newJtapassword</credentials> </user>
トランザクション・リカバリの実行時には、リカバリされるOC4Jプロセスの実際のセキュリティ・ストアにあるリカバリ・パスワードと、トランザクション処理中にjazn-data.xml
で構成されたパスワードが一致する必要があります。パスワードが一致しない場合、リカバリ・マネージャはOC4Jの下位プロセスと通信できないため、リカバリを完了できません。
トランザクション伝播では、追加のトランザクション・ロギング構成を必要としませんが、1つのトランザクションは複数のOC4Jプロセスに拡張されることがあるため、各OC4Jプロセスは、ロギングに関して相互に依存しないよう構成する必要があります。
この項では、トランザクション伝播機能に適用される次の制限事項について説明します。
OC4Jの旧リリースでは伝播はサポートされていません。トランザクション伝播をサポートするOC4Jインスタンスが、トランザクション伝播をサポートしない旧リリースのOC4JにデプロイされたBeanに対してRemote Method Invocationを実行しても、トランザクション・コンテキストは伝播されません。このため、コール元がトランザクションのスコープ内にあっても、リモート・マシンでの作業は、コール元のトランザクションのスコープ内で実行されません。アプリケーション・デプロイヤまたは管理者は、アプリケーションを様々なリリースのOC4Jにデプロイする場合、デプロイの前にアプリケーションのトランザクション要件を理解しておく必要があります。
トランザクションがOC4Jプロセスに伝播される場合、伝播されたトランザクションのスコープ内で障害が発生し、あるサーバーに対するリクエストがセカンダリ・サーバーにフェイルオーバーされると、そのトランザクションはロールバックされます。
EJBフェイルオーバーの動作の詳細は、『Oracle Containers for J2EE Enterprise JavaBeans開発者ガイド』を参照してください。
デバッグとトラブルシューティングに役立つヒントは、次のとおりです。
j2ee-logging.xml
ファイルを使用して、デバッグを有効化できます。トランザクションの問題は、トランザクション参加者に関連することが多いため、J2CA、JDBC、およびその他のロギングを有効化すると、コンテキストを理解するうえで非常に役立ちます。
oracle.j2ee.transaction
です。j2ee-logging.xml
ファイルの詳細は、『Oracle Containers for J2EE構成および管理ガイド』の「OC4Jでのロギング」の章を参照してください。
|
![]() Copyright © 2006 Oracle Corporation. All Rights Reserved. |
|