您的位置:首页 > 其它

【EJB基础】session bean

2016-03-16 17:22 344 查看
EJB的session bean分为有状态会话Bean和无状态会话Bean,下面看看这两个有什么区别。
 

有状态会话Bean

能够区分不同的客户端,并分为为不同的客户端保持与其对应的状态信息。即从某个客户端角度来看,似乎EJB对象正被它独占了一样,不会因为有任何其它的客户端同时对同一个EJB访问而影响其它最终的计算结果。
 
举例:两个不同用户往购物车加入商品。
@Stateful
@Remote
public classStatefulEjbBean implements StatefulEjb{

privateint state;
publicvoid addCart(int i) {
state=state+i;
}

//把产品加入购物车
publicString getProduct() {
return "把"+String.valueOf(state)+"加入购物车";
}

}
客户端代码调用:
/**
* 功能: 有状态会话Bean客户端调用
* 作者: 宋笑
* 日期: 2016-3-1 上午10:19:12
*
*/
public classStatefulEjbClient {

publicstatic void main(String[] args)throws Exception{
InitialContextctx=new InitialContext();

//第一次会话
StatefulEjbejb1=(StatefulEjb)ctx.lookup("StatefulEjbBean/remote");
//打印产品
System.out.println(ejb1.getProduct());
for(int i = 0; i < 10; i++) {
ejb1.addCart(1);
System.out.println(ejb1.getProduct());
}
System.out.println("---------第一次会话结束--------");

//第二次会话
StatefulEjbejb2=(StatefulEjb)ctx.lookup("StatefulEjbBean/remote");
//打印产品
System.out.println(ejb2.getProduct());
for(int i = 0; i < 10; i++) {
ejb2.addCart(1);
System.out.println(ejb2.getProduct());
}
System.out.println("---------第二次会话结束--------");
}
}
测试结果:



每一个会话相当于一个用户,两个用户调用同一个EJB对象,不会相互影响。两个用户都有自己单独的购物车。
 

无状态会话Bean

EJB容器不会对EJB的状态做管理,容器会使用实例池的方式,甚至单利的方式来实现无状态的Session
Bean。不能够区分不同的客户端,各个用户会共享同一个Bean。
 
举例:两个不同用户往购物车加入商品。
@Stateless
@Remote
public classStatelessEjbBean implements StatelessEjb {

privateint state;
publicvoid addCart(int i) {
state=state+i;
}

//加入的购物车产品
publicString getProduct() {
return "把"+String.valueOf(state)+"加入购物车";
}

}
客户端代码调用:
/**
* 功能: 无状态会话Bean客户端调用
* 作者: 宋笑
* 日期: 2016-3-1 上午10:19:29
*
*/
public classStatelessEjbClent {
publicstatic void main(String[] args)throws Exception{
InitialContextctx=new InitialContext();

//第一次会话
StatelessEjbejb1=(StatelessEjb)ctx.lookup("StatelessEjbBean/remote");
//打印产品
System.out.println(ejb1.getProduct());
for(int j = 0; j < 6; j++) {
ejb1.addCart(1);
System.out.println(ejb1.getProduct());
}
System.out.println("---------第一次会话结束--------");

//第二次会话
StatelessEjbejb2=(StatelessEjb)ctx.lookup("StatelessEjbBean/remote");
//打印产品
System.out.println(ejb2.getProduct());
for(int j = 0; j < 6; j++) {
ejb2.addCart(1);
System.out.println(ejb2.getProduct());
}
System.out.println("---------第二次会话结束--------");

}
测试结果:



两个用户调用同一个EJB对象,共享同一个EJB对象。就好像共用一个购物车一样。
 
有状态的会话Bean,每个用户有自己特有的一个实例,在用户的生存期内,bean保持了用户的信息,即“有状态”;一旦用户灭亡(调用结束或实例结束),bean的生命期也告结束。即每个用户最初都会得到一个初始的bean。
无状态会话Bean,bean一旦实例化就被加进会话池中,各个用户都可以共用。即使用户已经消亡,bean的生命期也不一定结束,它可能依然存在于会话池中,供其他用户调用。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: