ページの先頭行へ戻る
 Apcoordinatorユーザーズガイド

8.6.3 セションBean作成時の注意事項

セションBeanが再試行例外を発生して再試行される場合でも、再試行例外を発生する前にセションBeanが実行した処理は取り消されません。このため、EJB再試行機能で呼び出されるセションBeanは、以下の点に注意して作成してください。

トランザクションを使用する場合の注意事項

セションBeanの処理でトランザクションを必要とする場合は、再試行例外を発生させる前にトランザクションをロールバックしてください。セションBeanで開始したトランザクションや、セションBeanから呼び出された処理で開始されたトランザクションがすでにコミットされている場合、その処理は取り消せないため、再試行例外を発生させないでください。

また、上記のようにコミット、ロールバックをセションBeanで実行する場合は、セションBeanの呼び出し元が開始したトランザクションにセションBeanが参加することはできません。

引数の参照渡しを使用する場合の注意事項

通常は、EJBの呼び出しにおいては引数は値渡しで呼び出されます。このため、Callインタフェースを使ってセションBeanを呼び出すと、invokeメソッドの引数に与えたデータBeanのコピーがセションBeanに渡されます。

ただし、アプリケーションサーバによっては、クライアントとEJBが同一のJVM上に存在する場合に、 EJB呼び出しの性能を向上させる目的で、引数の参照渡しを可能にしている場合があります。引数の参照渡しを有効にした場合、Callインタフェースのinvokeに与えたデータBeanのインスタンスそのものがセションBeanに渡されます。データBeanはコピーされません。

引数の参照渡しを有効にする場合は、ビジネスクラスの引数に与えられたデータBeanをビジネスクラスの処理で変更しないでください。データBeanに変更を加えると、再試行によって呼び出された時に、変更後のデータBeanがビジネスクラスの引数に与えられます。

ビジネスクラス、セションクラス、アプリケーションクラスのデータを変更する場合の注意事項

以下のクラスのオブジェクトは、セションBeanの呼び出しが終了したあとも生存しています。これらのオブジェクトが持つデータを変更したあとで再試行例外を発生させた場合、再試行によってセションBeanが呼び出された時点で、オブジェクトが持つデータは変更後の状態のままになっています。

再試行前のデータ変更が再試行後に残っていることが問題となる場合は、再試行例外が発生する処理が完了したあとでビジネスクラス、セションクラス、アプリケーションクラスのデータを変更する処理を実行してください。