0

クライアントからを呼び出す場合は、最初にJNDIルックアップを介してオブジェクト参照EJBBeanを取得する必要があります。EJBHomeこのコードは、作業が必要になるたびに実行する必要があるEJBBeanため、冗長で高価になります。

この問題を解決するには、EJBHomeオブジェクト参照をキャッシュして、JNDIルックアップを繰り返さずにキャッシュから何度も再利用できます。

これはEJBHomeFactory Pattern(またはより一般的なサービスロケーターパターン)です。

Map私が見た実装の大部分は、キャッシュとして同期を使用しHashtableます。アプリケーションがサーバーにデプロイされたときにキャッシュが構築され、その後キャッシュに変更が加えられない場合(get()メソッドのみが実行されます)、本当に同期が必要ですかMap、それとも実行されHashMapますか?

HashMapスレッドの少なくとも1つがマップを変更する場合(これにはSOの投稿もあります)、安全ではないことはわかっていますが、この場合、スレッドは読み取りのみを実行します。

だから、でHashMap使用しても安全EJBHomeFactory Patternですか?

4

1 に答える 1

0

ライフサイクルが説明どおりであることを保証できる場合、非同期の HashMap が問題ないことは明らかです。ただし、私の本能は、これが現在の展開パターンへの脆弱な依存関係で構築されているということです。

同期されたデータ構造を使用する場合、現在および将来にわたって安全であることがわかります。同期が本当にパフォーマンスに影響を与えているという具体的な証拠がない限り、私は「明らかに正しい」実装を使用します。

ちなみに、いくつかの主要なアプリ サーバーは実際に JNDI ルックアップの結果をキャッシュしているため、使用したパターンが実際にどれだけ節約できるかは明らかではありません。

EJB 参照自体は再利用できるため、実際にホームに行く頻度をかなり低く抑えることができます。極端なパフォーマンスが目的である場合、これはさらなる調査手段になる可能性があります。

于 2009-08-26T08:07:30.293 に答える