Sun Java System Application Server Enterprise Edition 8.2 パフォーマンスチューニングガイド

参照渡しのセマンティクスの使用

Application Server のデフォルトでは、Bean のリモートインタフェースの呼び出しには、両者が同じ位置にある場合でも「値渡し」のセマンティクスが使用されます。値渡しのセマンティクスを使用するクライアントは、EJB コンポーネントに引数を渡す前に引数をコピーする必要があるため、これは負荷の大きい処理になる可能性があります。

ただし、ローカルクライアントは「参照渡し」セマンティクスを使用でき、その場合、渡されるオブジェクトをローカルインタフェースとリモートインタフェースが共有できます。しかしこれは、引数オブジェクトを共有可能にするためには、引数オブジェクトを適切に実装する必要があることを意味します。一般的には、可能な場合には参照渡しのセマンティクスを使用するほうが効率的です。

リモートインタフェースとローカルインタフェースを適切に使用することで、クライアントは EJB コンポーネントに効率的にアクセスできます。ローカルクライアントは参照渡しセマンティクスでローカルインタフェースを使用する一方で、リモートクライアントは値渡しセマンティクスでリモートインタフェースを使用します。

ただし、一部のインスタンスでは、次の例のような場合にローカルインタフェースを使用できない可能性があります。

このようなケースのために、Application Server では、同じ位置に存在する EJB コンポーネントのリモートインタフェースに参照によって引数を渡すためにクライアントが使用できる参照渡しオプションが用意されています。

参照渡しオプションは、アプリケーション全体または単一の EJB コンポーネントを対象に指定できます。アプリケーションレベルで指定された場合、アプリケーション内のすべての Beans は、そのリモートインタフェースに引数を渡すときに参照渡しセマンティクスを使用します。Bean レベルで指定された場合、Bean のリモートインタフェースへのすべての呼び出しは参照渡しセマンティクスを使用します。参照渡しフラグの詳細は、『Sun Java System Application Server Enterprise Edition 8.2 Developer’s Guide』「Value Added Features」を参照してください。

EJB コンポーネントが参照渡しセマンティクスを使用することを指定するには、配備記述子 sun-ejb-jar.xml で次のタグを使用します。

<pass-by-reference>true</pass-by-reference>.

これにより、EJB コンポーネントのメソッドが呼び出されるときの引数のコピーと、メソッドが戻るときの結果のコピーが回避されます。ただし、呼び出しの間に別のソースによってデータが変更されると問題が発生します。