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

在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:

【EJB二】有状态SessionBean和无状态SessionBean_第1张图片

无状态的SessionBean:

第一次执行:
【EJB二】有状态SessionBean和无状态SessionBean_第2张图片
再执行一次:

【EJB二】有状态SessionBean和无状态SessionBean_第3张图片

比较总结

通过以上实例,我们发现,每次实例化一个ejb对象时,有状态情况下,每次会重新初始化对象状态,而无状态情况下,会延续之前对象的状态进行执行。
所以:我们发现有状态和无状态SessionBean之间最主要的区别是它们的**生命期**。
有状态(Stateful):每当客户端实例化一个ejb对象时,都会进行初始化,在调用期间(生存期内),对象会维持它的状态,
当调用结束时,状态也随之消失。即“有状态”。
无状态(Stateless):每当客户端实例化一个ejb对象时,会将这个对象放在一个"共享池"中,当这个对象生存期结束时,再有其他调用时,
会去共享池中直接找到这个对象进行调用,不会再重复初始化。即每个新的对象不会有专门儿属于自己的状态。即“无状态”。

你可能感兴趣的:(无状态,会话Bean,有状态)