您的位置:首页 > 其它

【EJB二】有状态SessionBean和无状态SessionBean

2016-05-02 19:37 429 查看
在EJB中SessionBean分为有状态和无状态两种。二者之间的区别到底在哪里呢?通过一个实例来总结他们之间的区别。


Stateful SessionBean

//接口,有状态
public interface StatefulEjb {
void compute(int state);
int getResult();
}


//实现类,有状态
@Stateful
@Remote
public class StatefulEjbBean implements StatefulEjb {
private int state;
public void compute(int i) {
this.state=state+i;
}

public int getResult() {
return state;
}

}


Stateless SessionBean

//接口,无状态
public interface StatelessEjb {
void compute(int state);
int getResult();
}


//实现类,无状态
@Stateless
@Remote
public class StatelessEjbBean implements StatelessEjb {

private int state;
public void compute(int state) {
this.state+=1;

}
public int getResult() {

return state;
}

}


打包后,开始编写客户端


Client

需要引入服务jar包和编写jndi.properties文件


//调用有状态SessionBean
public class StatefulEjbClient {

/**
* @param args
* @throws NamingException
*/
public static void main(String[] args) throws NamingException {
InitialContext context=new InitialContext();

//第一次会话
StatefulEjb statefulEjb1=(StatefulEjb)context.lookup("StatefulEjbBean/remote");

System.out.println(statefulEjb1.getResult());
statefulEjb1.compute(1);
System.out.println(statefulEjb1.getResult());
statefulEjb1.compute(1);
System.out.println(statefulEjb1.getResult());
statefulEjb1.compute(1);
System.out.println(statefulEjb1.getResult());
statefulEjb1.compute(1);
System.out.println(statefulEjb1.getResult());
statefulEjb1.compute(1);
System.out.println(statefulEjb1.getResult());

//第二次会话
StatefulEjb statefulEjb2=(StatefulEjb)context.lookup("StatefulEjbBean/remote");

System.out.println(statefulEjb2.getResult());
statefulEjb2.compute(1);
System.out.println(statefulEjb2.getResult());
statefulEjb2.compute(1);
System.out.println(statefulEjb2.getResult());
statefulEjb2.compute(1);
System.out.println(statefulEjb2.getResult());
statefulEjb2.compute(1);
System.out.println(statefulEjb2.getResult());
statefulEjb2.compute(1);
System.out.println(statefulEjb2.getResult());

}

}


无状态SessionBean同上,只需要把名字修改一下即可。
在测试时,每次重新利用JNDI进行一次bean查找,就意味着开启了两次客户端,调用了两个Bean实例。


执行结果

有状态的SessionBean:



无状态的SessionBean:

第一次执行:



再执行一次:



比较总结

通过以上实例,我们发现,每次实例化一个ejb对象时,有状态情况下,每次会重新初始化对象状态,而无状态情况下,会延续之前对象的状态进行执行。
所以:我们发现有状态和无状态SessionBean之间最主要的区别是它们的**生命期**。
有状态(Stateful):每当客户端实例化一个ejb对象时,都会进行初始化,在调用期间(生存期内),对象会维持它的状态,
当调用结束时,状态也随之消失。即“有状态”。
无状态(Stateless):每当客户端实例化一个ejb对象时,会将这个对象放在一个"共享池"中,当这个对象生存期结束时,再有其他调用时,
会去共享池中直接找到这个对象进行调用,不会再重复初始化。即每个新的对象不会有专门儿属于自己的状态。即“无状态”。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: