无状态会话Bean中的实例变量 - 状态是如何维护的?

时间:2013-02-02 13:54:27

标签: java java-ee ejb-3.0 instance-variables stateless-session-bean

服务器在GlassFish 3.0上运行

@Stateless(mappedName="messengerservice")
public class MessengerService implements MsnService{

    int count;


    @Override
    public int getCount() {
        // TODO Auto-generated method stub
        count = count+1;
        return count;
    }
}

客户

  for(int i=0;i<5;i++){
      MsnService br = (MsnService) ctx.lookup("java:global/EJbTutorial/MessengerService");
      System.out.println(br.getCount());
  }

输出

1
2
3
4
5

EJB规范说服务器维护一个会话bean池,我在一个实例中增加值,重新查找希望获得一个新实例,似乎维护实例变量值

怎么可能?除非服务器每次都让我返回相同的实例,或者是它。

我甚至尝试过在循环中执行它并得到相同的结果。 任何可以解决的问题

2 个答案:

答案 0 :(得分:1)

它提供了正确的输出,referred from this link,它说

  

使用无状态bean,客户端可以调用任何可用的实例   只要EJB容器具有该功能,就可以实例化bean   集合无状态bean。这使得实例化的数量成为可能   要减少的bean,从而减少所需的资源。

     

Bean pooling任何没有的无状态会话bean方法实例   当前调用的EJB同样可以调用   容器或应用程序服务器来服务客户端的请求。   这允许EJB容器汇集无状态bean实例和
  提高绩效。

     

可伸缩性因为无状态会话bean能够提供服务   多个客户端,在应用程序拥有时,它们往往更具可伸缩性   大量的客户。与有状态会话bean相比,   无状态会话bean通常需要较少的实例化。

     

性能EJB容器永远不会移动无状态会话bean   从RAM out到二级存储,它可能与有状态有关   会话bean;因此,无状态会话bean可能提供更多   性能比有状态会话bean。

详细了解difference between stateless and stateful session beans ...

答案 1 :(得分:1)

为了测试,如果无国界豆确实汇集了,正如Tom Anderson建议的那样,我尝试执行并行线程

客户端

ExecutorService service =  Executors.newFixedThreadPool(10);           

for(int i=0; i<5;i++){
  Future future=  service.submit(new MessengerClient("Thread "+i+" :"));
  }        

service.shutdown();

<强>输出

Thread 0 :1
Thread 1 :1
Thread 3 :1
Thread 4 :1
Thread 2 :1
Thread 1 :2
Thread 2 :3
Thread 3 :4
Thread 4 :5
Thread 0 :6
Thread 1 :7
Thread 2 :8
Thread 3 :9
Thread 4 :10
Thread 0 :11
Thread 1 :2
Thread 2 :12
Thread 3 :13
Thread 4 :14
Thread 2 :15
Thread 1 :16
Thread 3 :17
Thread 4 :18
Thread 0 :19
Thread 0 :20

这证明了线程确实使用了新实例