EJB有状态的会话Bean和无状态的会话Bean的区别

       在EJB里面,会话Bean分为两种,一种是有状态的会话Bean,另一种是无状态的会话Bean,本节主要讲解一下两者之间的区别。
       对于有状态的会话Bean,这种情况属于,服务端与你单独开辟了一块空间与你进行交互。而客户端感觉服务端单独为他自己服务似的。而无状态的会话Bean,则服务端不提供了一个资源但是谁用都行,他不负责。所以客户端在使用的时候,则会感到这个服务 与其他人共享似的。

服务端

分别创建一个有状态的会话bean和一个无状态的会话 Bean。
新建一个EJB项目
新建项目1
新建项目2

然后创建两个接口,两个实现。(分别是有状态和无状态)
有状态会话Bean的接口和实现:

public interface StatefulEjb {
    public void compute(int i);
    public int getResult();
}
@Stateful
@Remote(StatefulEjb.class)
public class StatefulEjbBean implements StatefulEjb {

    private int state;

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

    public int getResult() {

        return state;
    }
}


无状态会话Bean的接口和实现:

public interface StatelessEjb {
    public void compute(int i);
    public int getResult();
}
@Stateless
@Remote(StatelessEjb.class)
public class StatelessEjbBean implements StatelessEjb{

    private int state;

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

    public int getResult() {

        return state;
    }
}


创建完之后的结构如下:
服务端接口


       之后部署到JBOSS上,(我用的版本是jboss-5.0.1.GA)然后启动JBOSS这样服务端就搭建好了。

客户端

       创建一个java项目,然后添加一个main方法,这个就不详细说了。分别测试有状态的会话Bean和无状态的会话Bean。
1、创建java项目(略)
2、修改环境,需要添加jar包。(jboss安装包里根目录里面client里面的所有jar包)


客户端代码

//测试有状态的会话Bean
public class StatefulEjbClient {

    public static void main(String[] args) throws NamingException {

        //第一次会话
        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());

        //第二次会话
        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());
    }
}


测试结果:
有状态的会话Bean测试结果

//测试无状态的会话Bean
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());

        //第二次会话
        StatelessEjb ejb2= (StatelessEjb) context.lookup("StatelessEjbBean/remote");

        System.out.println(ejb2.getResult());
        ejb1.compute(1);
        System.out.println(ejb2.getResult());
        ejb1.compute(1);
        System.out.println(ejb2.getResult());
        ejb1.compute(1);
        System.out.println(ejb2.getResult());
        ejb1.compute(1);
        System.out.println(ejb2.getResult());
    }
}


测试结果:
无状态的会话Bean测试结果

对比上述的两个结果:

       有状态的会话Bean,每一个会话 都是一个新的开始。而无状态的会话Bean 每个会话用的时候都会接着用上一次的会话。
       有状态会话bean :每个用户有自己特有的一个实例,在用户的生存期内,bean保持了用户的信息,即“有状态”;一旦用户灭亡(调用结束或实例结束),bean的生命期也告结束。即每个用户最初都会得到一个初始的bean。
       无状态会话bean :bean一旦实例化就被加进会话池中,各个用户都可以共用。即使用户已经消亡,bean 的生命期也不一定结束,它可能依然存在于会话池中,供其他用户调用。由于没有特定的用户,那么也就不能保持某一用户的状态,所以叫无状态bean。但无状态会话bean 并非没有状态,如果它有自己的属性(变量),那么这些变量就会受到所有调用它的用户的影响,这是在实际应用中必须注意的。

评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值