EJB的session 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对象,不会相互影响。两个用户都有自己单独的购物车。
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的生命期也不一定结束,它可能依然存在于会话池中,供其他用户调用。