【问题标题】:Instance Variables in Stateless Session Bean - state is maintained how?无状态会话 Bean 中的实例变量 - 状态是如何维护的?
【发布时间】:2013-02-02 13:54:26
【问题描述】:

服务器在 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 池,我在一个实例中增加值,重新查找希望得到一个新实例,并且似乎维护了实例变量值

这怎么可能?除非服务器每次都向我返回相同的实例,否则就是这样。

我什至尝试在循环中执行它并得到相同的结果。 任何人都可以阐明一些观点

【问题讨论】:

  • 如果你一次只有一个请求,那么容器只需要创建一个bean的实例。如果您在并行线程中运行多个客户端,您应该看到有多个 bean 实例在运行。
  • @TomAnderson 它确实做到了。谢谢

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


【解决方案1】:

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

使用无状态 bean,客户端可以调用任何可用的 只要 EJB 容器有能力,实例化的 bean 池化无状态 bean。这使得实例化的数量 要减少的 bean,从而减少所需的资源。

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

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

性能 EJB 容器永远不会移动无状态会话 bean 从 RAM 输出到辅助存储,它可以使用有状态的 会话 bean;因此,无状态会话 bean 可能会提供更大的 性能优于有状态会话 bean。

阅读更多关于difference between stateless and stateful session beans...

【讨论】:

    【解决方案2】:

    为了测试,如果无状态 Bean 确实像 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
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-08-04
      • 1970-01-01
      • 1970-01-01
      • 2011-01-02
      • 1970-01-01
      • 2012-04-30
      • 2011-03-31
      相关资源
      最近更新 更多