@Stateless和@Singleton之间的区别

时间:2013-01-22 17:45:56

标签: ejb ejb-3.1

我正在关注也使用EJB的this tutorial

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之间有什么区别?

2 个答案:

答案 0 :(得分:39)

您看到相同的输出,因为一次只有一个客户端访问EJB。应用程序服务器能够为每个调用回收相同的无状态EJB对象。如果您尝试同时访问 - 同时访问多个客户端 - 您将看到新的无状态实例出现。

请注意,根据服务器负载,即使同一客户端进行的两次连续方法调用也可能最终出现在不同的无状态EJB对象中!

对于单例EJB,没有区别 - 每个应用程序始终只有一个实例,无论有多少客户端尝试访问它。

答案 1 :(得分:34)

根据Oracle Documentation:

  

Singleton会话bean提供与无状态会话bean类似的功能,但与它们的不同之处在于每个应用程序只有一个单独的会话bean,而不是无状态会话bean池,其中任何一个都可以响应客户端请求。与无状态会话bean一样,单例会话bean可以实现Web服务端点。

单身人士can't be passivated:

  

与无状态会话bean一样,单例会话bean永远不会   钝化,只有两个阶段,不存在,准备好了   调用业务方法(...)

文档说明了when to use each kind of bean,而Singleton bean有以下内容:

  

单个企业bean需要由多个线程访问   同时进行。

     

应用程序需要企业bean来执行任务   应用程序启动和关闭。

因此,对于您的示例,两个注释之间没有区别。