Oracle® Fusion Middleware Oracle WebLogic Server JTAのプログラミング 11gリリース1 (10.3.6) B61631-04 |
|
![]() 前 |
![]() 次 |
この章では、Oracle WebLogic Serverで実行されるEnterprise JavaBeans (EJB)アプリケーションでトランザクションを統合する方法について説明します。
開始する前に、第2章「トランザクションについて」(特に次のトピック)を読んでください。
ここでは、Enterprise JavaBeansでのトランザクションのOracle WebLogic Server実装について説明します。このドキュメントにある情報は、Enterprise JavaBeans仕様2.1を補足するものです。
注意: この章を読み進める前に、EJB仕様2.1のドキュメントの内容、特に第16章「Support for Transactions」に記載されている概念やデータをよく理解しておく必要があります。 |
WebLogic ServerアプリケーションでのEnterprise JavaBeansの実装については、『Oracle WebLogic Server Enterprise JavaBeansのプログラミング』を参照してください。
以下のガイドラインは、WebLogic Server向けのEJBアプリケーションでトランザクションを実装するときに適用されます。
EJB仕様では、フラット・トランザクションのみがサポートされています。トランザクションをネストすることはできません。
EJB仕様では、複数のリソース(データベースなど)にまたがる分散トランザクションと、EJB CMP 2.1およびEJB CMP 1.1に対応した2フェーズ・コミット・プロトコルがサポートされています。
標準的なプログラミング手法を使用してトランザクション処理を最適化します。たとえば、トランザクションの境界を適切に設定すると、トランザクションの処理が速くなります。
EJBが実行されているWebLogic Serverインスタンス上の、ローカルTxDataSourceからデータベース接続を使用します。リモートWebLogic Serverインスタンス上のTxDataSourceからは接続を使用しないでください。
トランザクション対応のEJBアプリケーションでパフォーマンスを最大限に引き出すために、必ずEJBキャッシュを調整します。詳細は、『Oracle WebLogic Server Enterprise JavaBeansのプログラミング』を参照してください。
WebLogic Serverトランザクション・サービスのガイドラインについては、「機能と制限」を参照してください。
この節の内容は以下のとおりです。
トランザクション属性では、トランザクションがEJBアプリケーションでどのように管理されるのかが指定されます。各EJBについて、トランザクション属性により、トランザクションの境界がWebLogic Server EJBコンテナによって設定されるのか(コンテナ管理のトランザクション)、またはEJB自体によって設定されるのか(Bean管理のトランザクション)が指定されます。EJBがコンテナ管理とBean管理のどちらであるのかは、デプロイメント記述子のtransaction-type
要素の設定で決まります。transaction-type
要素の詳細は、EJB仕様2.1の第16章「Support for Transactions」と第21章「Deployment Descriptor」を参照してください。
概して、Bean管理のトランザクションよりもコンテナ管理のトランザクションの方がよく使用されます。なぜなら、その方がアプリケーションのコードがシンプルになるからです。たとえば、コンテナ管理のトランザクションでは、トランザクションを明示的に開始する必要がありません。
WebLogic Serverでは、EJB仕様2.1のセクション16.4で定義されているメソッド・レベルのトランザクション属性が完全にサポートされています。
コンテナ管理のトランザクションの場合、トランザクション属性はデプロイメント記述子のcontainer-transaction
要素で指定します。コンテナ管理のトランザクションには、すべてのエンティティBeanと、transaction-type
がContainer
に設定されているステートフルまたはステートレスのセッションBeanが含まれます。これらの要素に関する詳細は、『Oracle WebLogic Server Enterprise JavaBeansのプログラミング』を参照してください。
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のトランザクション・セマンティクス
メソッド | メソッドが起動された時点でのトランザクション・コンテキスト | ユーザー・トランザクション・メソッドにアクセスできるか |
---|---|---|
Constructor |
指定なし |
いいえ |
setSessionContext() |
指定なし |
いいえ |
ejbCreate() |
指定なし |
いいえ |
ejbRemove() |
指定なし |
いいえ |
ejbActivate() |
指定なし |
いいえ |
ejbPassivate() |
指定なし |
いいえ |
ビジネス・メソッド |
トランザクション属性によって「はい」または「いいえ」 |
いいえ |
afterBegin() |
はい |
いいえ |
beforeCompletion() |
はい |
いいえ |
afterCompletion() |
いいえ |
いいえ |
表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() |
指定なし |
はい |
Business method |
通常は、Beanでの直前のメソッド実行がトランザクション・コンテキストの中で終了していないかぎり、「いいえ」 |
はい |
afterBegin() |
適用なし |
適用なし |
beforeCompletion() |
適用なし |
適用なし |
afterCompletion() |
適用なし |
適用なし |
コンテナ管理のトランザクションを使用するステートフル・セッション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アプリケーションでは、トランザクションの途中でスローされた特定の例外を取得して処理する必要があります。例外処理の詳細は、EJB仕様2.1の第17章「Exception Handling」を参照してください。
EJBトランザクションでビジネス・メソッドによって例外がどのようにスローされるのかについては、セクション17.3にある表12 (コンテナ管理のトランザクション)および表13 (Bean管理のトランザクション)を参照してください。
クライアントの観点から見た例外については、セクション17.4を参照してください。特に、セクション12.4.1 (アプリケーション例外)、セクション17.4.2 (java.rmi.RemoteException
)、セクション17.4.2.1 (javax.transaction.TransactionRolledBackException
)、およびセクション17.4.2.2 (javax.transaction.TransactionRequiredException
)の参照をお薦めします。