服务器在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池,我在一个实例中增加值,重新查找希望获得一个新实例,似乎维护实例变量值
怎么可能?除非服务器每次都让我返回相同的实例,或者是它。
我甚至尝试过在循环中执行它并得到相同的结果。 任何可以解决的问题
答案 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
这证明了线程确实使用了新实例