Oracle® Fusion Middleware Oracle WebLogic Server JTA プログラマーズ ガイド 11g リリース 1 (10.3.1) B55540-01 |
|
戻る |
次へ |
この章の内容は以下のとおりです。
この章では、Oracle WebLogic Server で動作するエンタープライズ JavaBean (EJB) アプリケーションでトランザクションを実装する方法について説明します。
本題に入る前に、「トランザクションについて」を一読してください。その際、特に重要となるのは以下の節です。
ここでは、エンタープライズ JavaBean でのトランザクションの Oracle WebLogic Server 実装について説明します。ここで説明する情報は、Sun Microsystems 発行の EJB 仕様 2.1 を補足するものです。
注意 : この章を読み進める前に、EJB 仕様 2.1 のドキュメントの内容、特に「Support for Transactions」に記載されている概念やデータをよく理解しておく必要があります。 |
WebLogic Server アプリケーションでのエンタープライズ JavaBean の実装については、『Oracle Fusion Middleware Oracle WebLogic Server エンタープライズ JavaBeans (EJB) プログラマーズ ガイド』を参照してください。
以下のガイドラインは、WebLogic Server 向けの EJB アプリケーションでトランザクションを実装するときに適用されます。
EJB 仕様では、フラット トランザクションのみがサポートされている。トランザクションをネストすることはできません。
EJB 仕様では、複数のリソース (データベースなど) にまたがる分散トランザクションと、EJB CMP 2.1 および EJB CMP 1.1 に対応した 2 フェーズ コミット プロトコルがサポートされている。
標準的なプログラミング手法を使用してトランザクション処理を最適化する。たとえば、トランザクションの境界を適切に設定すると、トランザクションの処理が速くなります。
EJB が実行されている WebLogic Server インスタンス上の、ローカル TxDataSource からデータベース接続を使用する。リモート WebLogic Server インスタンス上の TxDataSource からは接続を使用しないでください。
トランザクション対応の EJB アプリケーションでパフォーマンスを最大限に引き出すために、必ず EJB キャッシュを調整する。詳細については、『Oracle Fusion Middleware Oracle WebLogic Server エンタープライズ JavaBeans (EJB) プログラマーズ ガイド』を参照してください。
WebLogic Server トランザクション サービスのガイドラインについては、「機能と制限」を参照してください。
この節の内容は以下のとおりです。
トランザクション属性では、トランザクションが EJB アプリケーションでどのように管理されるのかが指定されます。各 EJB について、トランザクション属性により、トランザクションの境界が WebLogic Server EJB コンテナによって設定されるのか (コンテナ管理のトランザクション)、または EJB 自体によって設定されるのか (Bean 管理のトランザクション) が指定されます。EJB がコンテナ管理と Bean 管理のどちらであるのかは、デプロイメント記述子の transaction-type
要素の設定で決まります。transaction-type
要素の詳細については、EJB 仕様 2.1 の「Support for Transactions」と「Deployment Descriptor」を参照してください。
概して、Bean 管理のトランザクションよりもコンテナ管理のトランザクションの方がよく使用されます。なぜなら、その方がアプリケーションのコードがシンプルになるからです。たとえば、コンテナ管理のトランザクションでは、トランザクションを明示的に開始する必要がありません。
WebLogic Server では、EJB 仕様 2.1 のセクション 16.4 で定義されているメソッド レベルのトランザクション属性が完全にサポートされています。
コンテナ管理のトランザクションの場合、トランザクション属性はデプロイメント記述子の container-transaction
要素で指定します。コンテナ管理のトランザクションには、すべてのエンティティ Bean と、transaction-type
が Container
に設定されているステートフルまたはステートレスのセッション Bean が含まれます。これらの要素に関する詳細については、『Oracle Fusion Middleware Oracle WebLogic Server エンタープライズ JavaBeans (EJB) プログラマーズ ガイド』を参照してください。
EJB とそのビジネス メソッドに対して指定できるトランザクション属性は以下のとおりです。
NotSupported
Supports
Required
RequiresNew
Mandatory
Never
trans-attribute
設定で WebLogic Server EJB コンテナがどのように機能するのかについては、EJB 仕様 2.1 のセクション 17.6.2 (http://java.sun.com/products/ejb/docs.html
) を参照してください。
デプロイメント記述子でタイムアウト値が定義されていない場合は、WebLogic Server EJB コンテナによって自動的にトランザクションのタイムアウトが設定されます。コンテナでは TimeoutSeconds
コンフィグレーション パラメータの値が使用されます。デフォルトの timeout 値は 30 秒です。
コンテナ管理のトランザクションを使用する EJB の場合、EJB は javax.transaction.UserTransaction
インタフェースにアクセスすることができず、また、開始と終了のトランザクション コンテキストが一致していなければなりません。さらに、コンテナ管理のトランザクションを使用する EJB では、javax.ejb.EJBContext
インタフェースの setRollbackOnly
メソッドと getRollbackOnly
メソッドのサポートが制限されています (EJB 仕様 2.1 のセクション 16.4.4.2 と 16.4.4.3 で規定されている規則によって呼び出しが制限される)。
Bean 管理のトランザクションの場合は、Bean が javax.transaction.UserTransaction
インタフェースのメソッドを使用してトランザクションの境界設定を指定します。Bean 管理のトランザクションには、transaction-type
が Bean
に設定されているステートフルまたはステートレスのセッション Bean が含まれます。エンティティ Bean では、Bean 管理のトランザクションは使用できません。
ステートレス セッション Bean の場合は、開始と終了のトランザクション コンテキストが一致していなければなりません。ステートフル セッション Bean の場合は、開始と終了のトランザクション コンテキストが必ずしも一致している必要はありません。一致していない場合は、WebLogic Server EJB コンテナによって Bean と未終了のトランザクションとの関連が維持されます。
Bean 管理のトランザクションを使用するセッション Bean では、javax.ejb.EJBContext
インタフェースの setRollbackOnly
メソッドと getRollbackOnly
メソッドは使用できません。
EJB 仕様 2.1 で使用される「トランザクションに参加する」という表現は、Bean が以下のいずれかの条件を満たしていると解釈します。
Bean がトランザクション コンテキストで呼び出される場合 (コンテナ管理のトランザクション)。
Bean が、クライアントによって呼び出された Bean メソッドの中で UserTransaction API を使用してトランザクションを開始し (Bean 管理のトランザクション)、かつ、クライアントによって呼び出された対応する Bean メソッドの終了時にそのトランザクションをサスペンドまたは終了しない場合。
この節の内容は以下のとおりです。
EJB 仕様 2.1 では、EJB の種類 (エンティティ Bean、ステートレス セッション Bean、またはステートフル セッション Bean) とトランザクションの種類 (コンテナ管理または Bean 管理) に基づいてトランザクション処理の動作を決定するセマンティクスが規定されています。それらのセマンティクスでは、メソッドが呼び出されるときのトランザクション コンテキストが規定されており、また、EJB が javax.transaction.UserTransaction
インタフェースのメソッドにアクセスできるかどうかが定義されています。EJB アプリケーションは、それらのセマンティクスに注意して設計する必要があります。
コンテナ管理のトランザクションの場合、トランザクション セマンティクスは Bean の種類によって異なります。
表 8-1 は、コンテナ管理のトランザクションのステートフル セッション Bean のトランザクション セマンティクスを示したものです。
表 8-1 コンテナ管理のトランザクションのステートフル セッション Bean のトランザクション セマンティクス
メソッド | メソッドが起動された時点でのトランザクション コンテキスト | ユーザ トランザクション メソッドへのアクセスの可否 |
---|---|---|
コンストラクタ |
指定なし |
不可 |
setSessionContext() |
指定なし |
不可 |
ejbCreate() |
指定なし |
不可 |
ejbRemove() |
指定なし |
不可 |
ejbActivate() |
指定なし |
不可 |
ejbPassivate() |
指定なし |
不可 |
ビジネス メソッド |
トランザクション属性によって有または無 |
不可 |
afterBegin() |
有 |
不可 |
beforeCompletion() |
有 |
不可 |
afterCompletion() |
無 |
不可 |
表 8-2 は、コンテナ管理のトランザクションのステートレス セッション Bean のトランザクション セマンティクスを示したものです。
表 8-3 は、コンテナ管理のトランザクションのエンティティ Bean のトランザクション セマンティクスを示したものです。
表 8-3 コンテナ管理のトランザクションのエンティティ Bean のトランザクション セマンティクス
メソッド | メソッドが起動された時点でのトランザクション コンテキスト | ユーザ トランザクション メソッドへのアクセスの可否 |
---|---|---|
コンストラクタ |
指定なし |
不可 |
setEntityContext() |
指定なし |
不可 |
unsetEntityContext() |
指定なし |
不可 |
ejbCreate() |
対応する create のトランザクション属性で決まる |
不可 |
ejbPostCreate() |
対応する create のトランザクション属性で決まる |
不可 |
ejbRemove() |
対応する remove のトランザクション属性で決まる |
不可 |
ejbFind() |
対応する find のトランザクション属性で決まる |
不可 |
ejbActivate() |
指定なし |
不可 |
ejbPassivate() |
指定なし |
不可 |
ejbLoad() |
|
不可 |
ejbStore() |
|
不可 |
ビジネス メソッド |
トランザクション属性によって有または無 |
不可 |
Bean 管理のトランザクションの場合、トランザクション セマンティクスはステートフルとステートレスのセッション Bean で異なります。エンティティ Bean では、Bean 管理のトランザクションは利用できません。
表 8-4 は、Bean 管理のトランザクションのステートフル セッション Bean のトランザクション セマンティクスを示したものです。
表 8-4 Bean 管理のトランザクションのステートフル セッション Bean のトランザクション セマンティクス
メソッド | メソッドが起動された時点でのトランザクション コンテキスト | ユーザ トランザクション メソッドへのアクセスの可否 |
---|---|---|
コンストラクタ |
指定なし |
不可 |
setSessionContext() |
指定なし |
不可 |
ejbCreate() |
指定なし |
可 |
ejbRemove() |
指定なし |
可 |
ejbActivate() |
指定なし |
可 |
ejbPassivate() |
指定なし |
可 |
ビジネス メソッド |
通常は不可 (Bean での直前のメソッド実行がトランザクション コンテキストの中で終了している場合を除く) |
可 |
afterBegin() |
非適用 |
非適用 |
beforeCompletion() |
非適用 |
非適用 |
afterCompletion() |
非適用 |
非適用 |
表 8-5 は、Bean 管理のトランザクションのステートレス セッション Bean のトランザクション セマンティクスを示したものです。
コンテナ管理のトランザクションを使用するステートフル セッション Bean では、javax.ejb.SessionSynchronization
インタフェースを実装してトランザクション同期通知を提供できます。その場合、ステートフル セッション Bean のすべてのメソッドでは、REQUIRES_NEW
、MANDATORY
、または REQUIRED
のいずれかのトランザクション属性をサポートしなければなりません。javax.ejb.SessionSynchronization
インタフェースの詳細については、EJB 仕様 2.1 のセクション 6.5.3 を参照してください。
Bean で SessionSynchronization
が実装されている場合、通常、WebLogic Server EJB コンテナではトランザクションのコミット時に Bean に対して以下のコールバックが行われます。
afterBegin()
beforeCompletion()
afterCompletion()
EJB コンテナは、beforeCompletion
メソッドで他の Bean を呼び出すか、または XA リソースを追加することができます。呼び出しの回数は、beforeCompletionIterationLimit
属性によって制限されます。この属性は、トランザクションがロールバックされるまでに処理されるコールバックのサイクル数を指定します。同期サイクルは、登録されているオブジェクトが beforeCompletion
コールバックを受信し、リソースが追加されるか、または以前に同期されていたオブジェクトが再登録されたときに発生します。反復制限を利用することで、同期サイクルが無限に繰り返されることを防止できます。
EJB アプリケーションのトランザクションには、タイムアウトを指定できます。トランザクションの存続期間がタイムアウトの設定値を超えた場合、トランザクション サービスによってそのトランザクションは自動的にロールバックされます。
注意 : トランザクションでbegin() を実行する前に、タイムアウトを設定する必要があります。タイムアウトを設定しても、すでに開始されているトランザクションには反映されません。 |
タイムアウトの指定方法は、トランザクションの種類によって異なります。
コンテナ管理のトランザクション。weblogic-ejb-jar.xml デプロイメント記述子で trans-timeout-seconds 属性をコンフィグレーションします。
Bean 管理のトランザクション。アプリケーションによって UserTransaction.setTransactionTimeout
メソッドが呼び出されます。
WebLogic Server EJB アプリケーションでは、トランザクションの途中で送出された特定の例外を検出して処理する必要があります。例外処理の詳細については、Sun Microsystems 発行の EJB 仕様 2.1 の「Exception Handling」を参照してください。
EJB トランザクションでビジネス メソッドによって例外がどのように送出されるのかについては、セクション 17.3 にある表 12 (コンテナ管理のトランザクション) および表 13 (Bean 管理のトランザクション) を参照してください。
クライアントの観点から見た例外については、セクション 17.4 を参照してください。特に、セクション 17.4.1 (アプリケーション例外)、セクション 17.4.2 (java.rmi.RemoteException
)、セクション 17.4.2.1 (javax.transaction.TransactionRolledBackException
)、およびセクション 17.4.2.2 (javax.transaction.TransactionRequiredException
) の参照をお勧めします。