EJBクライアントとセションBean間のオブジェクトの受け渡し方法には、値渡しと参照渡しがあります。
値渡し
オブジェクトのコピーが渡されます。
参照渡し
オブジェクトがコピーされずに渡されます。
リモートビジネスインタフェース経由の呼び出しでは値渡し、ローカルビジネスインタフェース経由の呼び出しでは参照渡しとなります。
参照
Interstageは、リモートビジネスインタフェース経由の呼び出しで参照渡しを利用することが可能です。詳細は、Interstage Application Serverチューニングガイドの「EJBコンテナのチューニング」を参照してください。
Apcoordinatorを利用している場合、以下のオブジェクトがEJBクライアントとセションBeanの間で受け渡されます。これらが値渡しとなるか参照渡しとなるかは、上記の仕様にしたがいます。
セションBeanの呼び出し時に指定したデータBeanやHashMap
セションBeanのビジネスクラスの返却値となるデータBeanやHashMap
セション同期機能で転送するセション情報
値渡しと参照渡しで、以下の動作に違いがあります。
データBeanを書き換えた場合の動作に違いがあります。
値渡しの場合、EJBクライアントからセションBeanを呼び出すと、データBeanのコピーがセションBeanに渡されます。セションBean側でデータBeanのプロパティを変更しても、ビジネスクラスから返却しない限りは、その変更をEJBクライアントが参照することはできません。
参照渡しの場合、データBeanがコピーされずにEJBクライアントからセションBeanに渡されます。セションBean側でデータBeanのプロパティを変更すると、その変更がEJBクライアントからも参照可能となります。参照渡しの場合に不用意にセションBean側でデータBeanを書き換えると、その書き換えがEJBクライアントの処理に影響して予期しない結果となる可能性があります。データBeanの代わりにHashMapを使った場合も同様です。
セション情報の同期機能を利用している場合の動作に違いがあります。
値渡しの場合、EJBクライアントからセションBeanを呼び出すと、セション情報のコピーがセションBeanに渡されます。セションBean側でセション情報を書き換えても、セションBeanから制御が戻るまではEJBクライアント側には反映されません。
参照渡しの場合、EJBクライアントのセション情報がコピーされずにセションBeanに渡されます。セションBean側でセション情報を変更すると、セションBeanから制御が戻る前にその変更がEJBクライアントから参照可能となります。
EJBクライアントがWebアプリケーションの場合、以下のオブジェクトは複数のHTTPリクエストで共有されます。
HTTPリクエストをまたいで使用されるデータBean (setResponseBeanメソッドの引数に指定したもの、セションスコープのビジネスクラスに格納しているもの、セションクラスに格納しているものなど)
セション情報
参照渡しの場合、Webアプリケーションが上記のオブジェクトをセションBeanに渡し、セションBeanがそのオブジェクトを書き換えている途中で別のHTTPリクエストが発生すると、書き換え途中の状態がWebアプリケーションから参照されます。また、セションBeanの実行中にHTTPリクエストが発生し、Webアプリケーションで上記のオブジェクトを書き換えると、書き換え途中の状態がセションBeanから参照されます。このことが問題となる場合は、排他を考慮したプログラミングが必要です。