Oracle® Fusion Middleware Oracle WebLogic ServerメッセージドリブンBeanのプログラミング 11g リリース1(10.3.3) B61425-01 |
|
前 |
次 |
MDB内では、ビジネス・ロジック(データベース・トランザクションを含む)はonMessage()
メソッド内で実行されます。EJBアプリケーション内では、複数のMDBが複数のonMessage()
呼出しを実行できます。各onMessage()
呼出しでデータベース・トランザクションを実行すると、大きなオーバーヘッドが発生する場合があります。これは、各呼出しで独自のデータベース接続が必要となるためです。
WebLogic Serverには、複数のonMessage()
呼出しを1つのトランザクションとしてグループ化するためのメカニズムが用意されています。このメカニズムによって、すべてのトランザクションが単一のI/Oリクエストにグループ化されるため、EJBアプリケーションのデータベース・パフォーマンスが向上する場合があります。トランザクションのグループ化により、トランザクション・ログが少なくて済みます。
MDB内でのトランザクション管理については、「MDBのトランザクション管理方式の構成」を参照してください。
注意: トランザクション・バッチ処理は、すべてのMDBアプリケーションに対して有効というわけではありません。たとえば、MDBがデータベースに対して複数の呼出しを行うアプリケーションでは、データベースのデッドロックが発生する場合があります。トランザクション・バッチ処理機能を使用すると、MDBはトランザクションにつき、より多くの行をロックするようになり、これがデータベースのデッドロックを引き起こす場合があります。 |
MDBのトランザクション・バッチ処理は、max-messages-in-transaction
要素を定義することによって有効化できます。この要素は、weblogic-ejb-jar.xml
デプロイメント記述子のmessage-driven-descriptor
要素の一部です。
max-messages-in-transaction
は、WebLogic ServerがonMessage()
トランザクションを処理する際に使用するバッチ・サイズを定義します。ただし、バッチ・サイズを増やすと、レイテンシが増大する場合があります。最初は5など、小さな値から設定してください。この値は、アプリケーションのパフォーマンスで許容される範囲で増やすことができます。
MDBのバッチ処理を使うと、トランザクションにつき、より多くのメッセージが処理されます。これによって、各トランザクションで実行される処理が増えるため、より多くのトランザクションがタイムアウトする場合があります。トランザクションのタイムアウト値は、weblogic-ejb-jar.xml
のtrans-timeout-seconds
属性の値を増やすことによって増加できます。
MDBトランザクション・バッチ処理では、アプリケーション・コードを変更する必要がありません。アプリケーションに関しては、個々のメッセージは1つずつ処理されます。アプリケーション・レベルのメッセージ・リストはありません。
WebLogic Serverはトランザクションを管理するために、内部的にキューを作成します。各メッセージは、キュー内のメッセージ数がmax-messages-in-transaction
で定義されているバッチ・サイズに達するまでキューに入れられます。ただし、次にキューに入れるメッセージが存在しない場合、キュー内の現在のメッセージは送出され、処理されます。
1つのonMessage()
呼出しが失敗すると、バッチ全体がロールバックされます。その失敗が、weblogic-ejb-jar.xml
のtrans-timeout-seconds
属性で定義されるトランザクションのタイムアウトに起因している場合、MDBコンテナはバッチ・サイズを一時的に減らし、小さなバッチでトランザクションの処理を試行します。
別の理由による失敗の場合、MDBは、失敗したバッチ内の各メッセージを個別のトランザクションとして再処理します。これによって、個々のonMessage()
呼出しによって、バッチ全体が恒久的にハングする事態を回避できます。