2009-08-26 9 views
0

クライアントからEJBBeanを呼び出す場合は、まずJNDIルックアップを使用してEJBHomeオブジェクト参照を保持する必要があります。このコードは、EJBBeanで作業する必要があるたびに実行する必要があります。そのため、冗長で高価になります。EJBHomeFactoryパターンの実装に同期マップが必要ですか?

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

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

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

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

EJBHomeFactory PatternではHashMapを安全に使用できますか?

答えて

0

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

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

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

EJB参照自体を再利用することができるため、実際に家に行く頻度を非常に低く抑えることができます。極端なパフォーマンスが目的である場合、これはさらに探索する道になるかもしれません。

関連する問題