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

ローカルインタフェースとリモートインタフェースの使用

この節では、ローカルおよびリモートのクライアントによって EJB コンポーネントが使用されるときの考慮事項について説明します。

ローカルインタフェースを優先する

EJB コンポーネントは、リモートインタフェースとローカルインタフェースを持つことができます。Bean と同じアプリケーションサーバーインスタンスに配置されていないクライアント (リモートクライアント) は、リモートインタフェースを使用して Bean にアクセスします。リモートインタフェースの呼び出しには、引数を整列化し、整列化したデータをネットワーク経由で転送し、引数を非整列化し、受信側の端で振り分ける一連の処理が必要です。そのため、リモートインタフェースの使用には大きなオーバーヘッドが伴います。

EJB コンポーネントがローカルインタフェースを持つ場合、同じアプリケーションサーバーインスタンス内のローカルクライアントは、そのインタフェースをリモートインタフェースの代わりに使用できます。引数の整列化、転送、および非整列化が不要になるため、ローカルインタフェースを使用するほうが効率的です。

Bean がローカルクライアントのみによって使用される予定の場合、ローカルインタフェースのみを提供する意味があります。一方、Bean を位置独立にする予定の場合は、リモートインタフェースとクライアントインタフェースの両方を提供することをお勧めします。これにより、リモートクライアントはリモートインタフェースを使用し、ローカルクライアントは効率性のためにローカルインタフェースを使用できるようになります。

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

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