1

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

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

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

4

2 回答 2

1

它给出了正确的输出,从这个链接引用,它说

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

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

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

性能 EJB 容器永远不会将无状态会话 bean 从 RAM 移出到辅助存储,这可能与有状态会话 bean 一样;因此,无状态会话 bean 可能提供比有状态会话 bean 更高的性能。

阅读更多关于无状态和有状态会话 bean 之间的区别......

于 2013-02-02T16:42:22.730 回答
1

为了测试,如果无状态 Bean 确实像汤姆安德森建议的那样进行了池化,我尝试使用并行线程执行它

客户

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

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

于 2013-02-03T06:52:12.013 回答