1

服务器在GlassFish 3.0上运行无状态会话Bean中的实例变量 - 状态是如何维护的?

@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的池,我增加val在一种情况下,重新查找希望得到一个新的实例,它似乎实例变量值保持

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

我甚至试过它在一个循环中执行它并得到相同的结果。 可以在任何提供一些线索

+1

如果一次只有一个请求,那么容器只需要创建一个bean实例。如果您在并行线程中运行多个客户端,则应该看到有多个bean在运行。 –

+0

@汤姆安德森当然没有。谢谢 – Sudhakar

回答

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 

嗯,这证明了线程正在使用新实例

1

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

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

豆池是不 目前调用的任何无状态会话bean的方法实例同样适用于由EJB
容器或应用服务器调用服务的客户端的请求。 这允许EJB容器共享无状态bean实例并提高性能。

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

性能EJB容器决不会将无状态会话bean 从RAM移出到辅助存储,它可能会使用有状态的 会话bean;因此,无状态会话bean可能会提供比有状态会话Bean更高的性能 性能。

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