欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

有状态的EJB对象和无状态的EJB对象

程序员文章站 2024-02-22 22:09:34
...



一,定义有状态Bean和无状态Bean


有状态Bean:


@Stateful
@Remote
public class StatefulEjbBean implements StatefulEjb{

	private int state;
	
	@Override
	public void compute(int i) {
		state=state+i;
	}

	@Override
	public int getResult() {
		return state;
	}

}


无状态Bean:


@Stateless
@Remote
public class StatelessEjbBean implements StatelessEjb {

	private int state;

	@Override
	public void compute(int i) {
		state = state + i;
	}

	@Override
	public int getResult() {
		return state;
	}
}


二,客户端测试及结果


1,测试有状态EJB对象:


public class StatefulEjbClient {

	public static void main(String[] args) throws Exception {
		InitialContext context=new InitialContext();
		//第一次会话
		StatefulEjb ejb1=(StatefulEjb)context.lookup("StatefulEjbBean/remote");
		System.out.println(ejb1.getResult());
		ejb1.compute(1);
		System.out.println(ejb1.getResult());
		ejb1.compute(1);
		System.out.println(ejb1.getResult());
		ejb1.compute(1);
		System.out.println(ejb1.getResult());
		ejb1.compute(1);
		System.out.println(ejb1.getResult());
		ejb1.compute(1);
		System.out.println(ejb1.getResult());
		System.out.println("第一次会话结束---------");
		
		//第二次会话
		StatefulEjb ejb2=(StatefulEjb)context.lookup("StatefulEjbBean/remote");
		System.out.println(ejb2.getResult());
		ejb2.compute(1);
		System.out.println(ejb2.getResult());
		ejb2.compute(1);
		System.out.println(ejb2.getResult());
		ejb2.compute(1);
		System.out.println(ejb2.getResult());
		ejb2.compute(1);
		System.out.println(ejb2.getResult());
		ejb2.compute(1);
		System.out.println(ejb2.getResult());
		System.out.println("第二次会话结束---------");
		
		
		
	}

}

结果:


有状态的EJB对象和无状态的EJB对象


2,测试无状态EJB对象:



public class StatelessEjbClient {

	public static void main(String[] args) throws NamingException {
		InitialContext context=new InitialContext();
		//第一次会话
		StatelessEjb ejb1=(StatelessEjb)context.lookup("StatelessEjbBean/remote");
		System.out.println(ejb1.getResult());
		ejb1.compute(1);
		System.out.println(ejb1.getResult());
		ejb1.compute(1);
		System.out.println(ejb1.getResult());
		ejb1.compute(1);
		System.out.println(ejb1.getResult());
		ejb1.compute(1);
		System.out.println(ejb1.getResult());
		ejb1.compute(1);
		System.out.println(ejb1.getResult());
		System.out.println("第一次会话结束---------");
		
		//第二次会话
		StatelessEjb ejb2=(StatelessEjb)context.lookup("StatelessEjbBean/remote");
		System.out.println(ejb2.getResult());
		ejb2.compute(1);
		System.out.println(ejb2.getResult());
		ejb2.compute(1);
		System.out.println(ejb2.getResult());
		ejb2.compute(1);
		System.out.println(ejb2.getResult());
		ejb2.compute(1);
		System.out.println(ejb2.getResult());
		ejb2.compute(1);
		System.out.println(ejb2.getResult());
		System.out.println("第二次会话结束---------");
		
		//判断每次查找到的对象是否一样
		System.out.println(ejb1==ejb2);//false
		
	}

}

结果:


有状态的EJB对象和无状态的EJB对象



三,结果对比


        通过多次执行,发现对于有状态的EJB对象,每次通过查找获得的对象都是新对象;而对于无状态的EJB对象,每次查找获得的对象都有一个单例类的效果,多次执行测试无状态的EJB对象的方法,会发现服务端的貌似始终在对一个对象进行操作。