40

これもEJBを使用するこのチュートリアルに従っています。

package exercise1;

import java.util.Random;
import javax.ejb.Stateless;
import javax.inject.Named;

@Stateless
public class MessageServerBean {
    private int counter = 0;

    public String getMessage(){
        Random random = new Random();
        random.nextInt(9999999);
        int myRandomNumber = random.nextInt();
        return "" + myRandomNumber;
    }

    public int getCounter(){
        return counter++;
    }    
}

出力例を次に示します。


Faceletsからのこんにちは
メッセージは:84804258
カウンターは:26
メッセージサーバーBeanは:exercise1.MessageServerBean@757b6193


これが私の観察です:

  • Beanを設定すると、@Stateless常に同じオブジェクトIDが取得され、カウンターは常に増加します。
  • @Statefulページを更新するたびに新しいインスタンスを取得するときにBeanを設定すると。
  • に設定すると、同じオブジェクトID、カウンターインクリメント @Singletonに設定した場合と同じ結果が得られます。@Stateless

@Statelessしたがって、私が実際に理解したいのは、この場合のと@SingletonEJBの違いは何ですか?

4

2 に答える 2

46

一度にEJBにアクセスするクライアントは1つだけなので、同じ出力が表示されます。アプリケーションサーバーは、呼び出しごとに同じステートレスEJBオブジェクトをリサイクルできます。同時アクセス(同時に複数のクライアント)を試みると、新しいステートレスインスタンスが表示されます。

サーバーの負荷によっては、同じクライアントによって2回連続してメソッドが呼び出された場合でも、ステートレスEJBオブジェクトが異なる場合があることに注意してください。

シングルトンEJBの場合、違いはありません。アクセスしようとするクライアントの数に関係なく、アプリケーションごとにインスタンスは常に1つだけです。

于 2013-01-22T19:12:05.200 に答える
41

Oracleのドキュメントによると:

シングルトンセッションBeanは、ステートレスセッションBeanと同様の機能を提供しますが、ステートレスセッションBeanのプールとは対照的に、アプリケーションごとに1つのシングルトンセッションBeanしかないという点で異なり、いずれもクライアント要求に応答する可能性があります。ステートレスセッションBeanと同様に、シングルトンセッションBeanはWebサービスエンドポイントを実装できます。

シングルトンは不動態化できません:

ステートレスセッションBeanのように、シングルトンセッションBeanは不動態化されることはなく、存在せず、ビジネスメソッドを呼び出す準備ができている2つのステージしかありません(...)

ドキュメントには、各種類のBeanをいつ使用するかが説明されており、シングルトンBeanには次のものがあります。

単一のエンタープライズBeanには、複数のスレッドから同時にアクセスする必要があります。

アプリケーションには、アプリケーションの起動時とシャットダウン時にタスクを実行するためのエンタープライズBeanが必要です。

したがって、あなたの例では、2つの注釈の間に違いはありません。

于 2013-01-22T18:08:36.153 に答える