2012-01-16 15 views
6

アプリケーションサーバがステートレスEJBをプールする理由は何ですか?なぜステートレスEJBがプールされるのですか?

私は、呼び出しの取り込みのためにアプリケーションの作業負荷を制御することは有効ですが、これはサーバーを呼び出すクライアントがFAÇADEであるEJBのプーリングを正当化するだけです。

内部EJB(公開されておらず、ビジネスロジックを実行するために内部的に呼び出されるもの)をプールすることは、どんな利点もありますか? (Springのように)共有の単一インスタンスを使用する代わりに。

少なくとも1つの欠点について考えることができます。高度に使用される内部EJBがボトルネックとして機能する可能性があります。

答えて

3

ステートレスセッションBean EJBは必ずしもスレッドセーフではありません。それらはJMSセッションのようなリソースを保持することができ、一度に複数のスレッドと共有することはできません。そのため、同じBeanに対する複数のリクエストを同時に処理できるようになります(JMSリソースもプールされますが、例のためにそれを使って)。

+0

ステートレスの場合、並行性によって脅かされる状態はないため、競合状態は発生しないため、スレッドセーフです。間違っていますか?はい、彼らは注入されたリソースのようないくつかの状態を持っていることを知っていますが、多分彼らはステートレスと呼ばれるべきではありません! :)私は正しい答えを取る。 – edutesoy

+0

@edutesoy私はあなたの説明に同意します。しかし、なぜその状態が維持されているのか。 –

3

ステートレスなEJBがプールされる理由も知りたいと思います。しかし、私は彼らがなぜ必要に応じて作成され、破壊されるのではなく、プールされているのかを知りたい。無関係な要求に対してインスタンスを再利用できるという事実は、ステートレスBeanの実装をかなり複雑にします(インスタンスフィールドの使用について信じられないほど注意する必要があることを意味します)。

具体的には、パフォーマンス上のメリットはありません。私はJBoss(6、IIRC)でステートレスBeanの実装を突き破っただけで、そのBeanインスタンス自体はプールされています。メソッドの呼び出しを処理する配管は、使用するたびにゼロから再作成されます。これは、パフォーマンスの節約だけが単一のオブジェクト作成であることを意味します。これは、ほんのわずかな時間で済むはずです。 Beanが重いリソースを取得し、呼び出し間でそれらを保持しているのは、私がそれが自明でないことがわかる唯一の状況です。しかし、その場合、Beanは実際に栄光に満ちた、ひどく管理されたプールとして使用されています。正しいソリューションは、リソースを直接プールすることです!

ここで、EJBは長い時間がかかりました。彼らが最初に出てきたときには、オブジェクトの作成は高価だったので、それらをプールすることは意味がありました。しかし、その時代はずっと前になってしまった。 EJB3でプーリングがドロップされなかったのはなぜですか?

+0

あなたが何千もの同時リクエストを持っているとすれば、メモリに数千のインスタンスを置くのではなく、スレッドセーフであることがわかっている限り、それらをプールして@Singletonとして作成するのは理にかなっています。 –

+1

Beanがスレッドセーフであれば、はい、シングルトンが理想的です。しかしそうでない場合、プールされたインスタンスとスローアウェイインスタンスのメモリ負荷は同じになります。プールされたインスタンスは実際にガベージコレクタに*より多くの*働きかけを与えます。なぜなら、それらは保育園から逃げるために十分長く生きているからです。 –

+0

それは大きな主張です。私はそれは、各リクエストが処理する時間、したがってそれらのオブジェクトがプール内で過ごす時間に依存すると考えます。ほとんどの場合、いつでも使用できますが、作成/破棄にいくらかのメリットがあります。これはトラフィックの傾向などにも依存します。これは非常に細かい解析IMOです。 –

関連する問題