web-dev-qa-db-ja.com

@Statelessと@Singletonの違い

私は このチュートリアル も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
Message Server Bean:Exercise1.MessageServerBean@757b6193


これが私の観察です:

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

それで、私が実際に理解したいのは、この場合の@Stateless@Singleton EJBの違いは何ですか?

30
godzillante

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

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

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

40
gcvt

Oracleドキュメント:

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

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

ステートレスセッションBeanのように、シングルトンセッションBeanは決して非活性化されず、存在しないビジネスメソッドの呼び出しの準備ができている2つの段階しかありません(...)

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

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

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

したがって、あなたの例では、2つのアノテーションに違いはありません。

35
kauedg