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

简介: 一,定义有状态Bean和无状态Bean有状态Bean:@Stateful@Remotepublic class StatefulEjbBean implements StatefulEjb{ private int state; @Override public v...



一,定义有状态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("第二次会话结束---------");
		
		
		
	}

}

结果:




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对象的方法,会发现服务端的貌似始终在对一个对象进行操作。







目录
相关文章
|
5月前
|
Java 数据库连接 数据库
|
8月前
|
存储 Java 数据库
Spring的使用-Bean对象的储存和获取/Bea对象的作用域与生命周期
Spring的使用-Bean对象的储存和获取/Bea对象的作用域与生命周期
|
XML Java 数据格式
【Spring 从0开始】IOC容器的Bean管理 - 基于XML,注入外部bean、内部bean和级联赋值
【Spring 从0开始】IOC容器的Bean管理 - 基于XML,注入外部bean、内部bean和级联赋值
【Spring 从0开始】IOC容器的Bean管理 - 基于XML,注入外部bean、内部bean和级联赋值
|
设计模式 Java 索引
【设计模式】代理模式 ( 动态代理使用流程 | 创建目标对象 | 创建被代理对象 | 创建调用处理程序 | 动态创建代理对象 | 动态代理调用 )
【设计模式】代理模式 ( 动态代理使用流程 | 创建目标对象 | 创建被代理对象 | 创建调用处理程序 | 动态创建代理对象 | 动态代理调用 )
130 0
【设计模式】代理模式 ( 动态代理使用流程 | 创建目标对象 | 创建被代理对象 | 创建调用处理程序 | 动态创建代理对象 | 动态代理调用 )
|
SQL 存储 缓存
Hibernate三种实体状态(五)
Hibernate三种实体状态(五)
343 0
Hibernate三种实体状态(五)
【EJB学习笔记】——有状态的会话Bean和无状态的会话Bean
  EJB中的会话Bean(Session Bean)分为有状态的(Stateful)会话Bean和无状态的(Stateless)会话Bean。   对象的状态是由其实例变量(即成员变量)的值组成的
|
存储 设计模式 缓存
【设计模式】享元模式 简介 ( 定义 | 对象池 | 内部状态 | 外部状态 | 适用场景 | 相关角色 )
【设计模式】享元模式 简介 ( 定义 | 对象池 | 内部状态 | 外部状态 | 适用场景 | 相关角色 )
274 0