Bean的状态

一,什么是无状态Bean?

    从字面意思来理解,无状态会话Bean是没有能够标识它的目前状态的属性的Bean。Bean一旦实例化就被加进会话池中,各个用户都可以共用。即使用户已经消亡,bean 的生命期也不一定结束,它可能依然存在于会话池中,供其他用户调用。由于没有特定的用户,那么也就不能保持某一用户的状态,所以叫无状态bean。但无状态会话bean并非没有状态,如果它有自己的属性(变量),那么这些变量就会受到所有调用它的用户的影响,这是在实际应用中必须注意的。下面通过代码来说明一下:

public class A {  
   public A() {}
   public String hello() {  
      return "Hello Who?";
   }  
}  

public class Client {
   public Client() {
      A a = new A();  
      System.out.println(a.hello());
      A b = new A();
      System.out.println(b.hello());
   }  
}

    在Client中生成了两个A的实例,不管是对象a还是b,它们是没有状态的。对于Client来说a和b是没有差别的(虽然a != b)。所以同一个无状态会话Bean的实例都是相同的,可以被不同的客户端重复使用。

二,什么是状态会话Bean?

    至于状态会话Bean,可以这样理解:它是有存储能力的。也就是说至少有一个属性来标识它目前的状态。每个用户有自己特有的一个实例,在用户的生存期内,Bean保持了用户的信息,即“有状态”,一旦用户灭亡(调用结束或实例结束),Bean的生命周期也告结束。即每个用户最初都会得到一个初始的Bean。

public class B {

    private String name;
    
    public B(String arg) {
        this.name = arg;    
    }
    
    public String hello() {
        return "Hello" + this.name;    
    }
}  
  
public class Client {
    
    public Client() {
        B a = new B("China");
        System.out.println(a.hello());
        B b = new B("World");
        System.out.println(b.hello());
    }
} 

三,调度池

    其实调度池的概念同数据连接池概念基本相同,都是为了提高系统性能而设计的。就像是饺子馆一样,饺子的做法可以有两种,一种是不管当前有没有客人,先将一些饺子下锅,等到客人来后可以马上捞出来给客人吃。还有一种是客人来后才将饺子下锅。调度池的概念就像是饺子的第一种做法一样,先将一些Bean实例放入池中,(也就是缓存起来,具体缓存多少取决于不同的容器)等到客户端调用时直接可以取来使用。

四,无状态会话Bean实现调度池调度

    因为无状态会话Bean是不保存会话状态的,所以无论哪个客户端调用了某个无状态会话Bean,都没有差别,也就是说任何一个无状态会话Bean的实例都可以为客户端程序提供服务。而且无状态会话Bean同客户端的关系是1:n。也就是说,同一个会话Bean实例可以供不同客户端使用。因此无状态会话Bean可以被存储在调度池中,供不同客户端重用。

五,状态会话Bean实现调度池调度

    因为状态会话Bean是保持当前会话的状态的,所以实现起来远比无状态会话Bean困难。因为它要保存会话状态,但物理内存的空间是有限的,想要保存n多客户端当前会话状态是不可能的。EJB容器采取了同操作系统相同的做法,将状态会话Bean对话状态保存在硬盘或其它存储器中(钝化passivation)。当被钝化的Bean原先的客户端调用其方法时,被钝化的状态重新交还给Bean(激活activation)。也许容器把被钝化的状态交还给不同的Bean实例,那又有什么关系呢?只要这个Bean实例能跟原先钝化之前的那个Bean实例一模一样就行了。事实上它的确一模一样,大多数容器采用最近很少被使用(Least Recently Used:LRU)的钝化策略。因为客户端是不可能一直在执行操作,他可能在看新闻或其它什么的。所以以这种方式钝化Bean是非常合理有效的。但有一个例外:正在进行事务处理的Bean一定要等到事务处理完毕后才能被钝化。大多数容器采用根据需要被激活(Just-in-time)的策略。客户有请求,ok没问题,激活那个被钝化了的Bean。注:钝化和激活跟无状态会话Bean没关系。

六,对话状态遵从的规则

    Bean遵从Java对象序列化规则(Java Object Serialization)。因为javax.ejb.EnterpriseBean接口扩展了java.io.Serializable这个接口,所以每个Enterprise Bean类都间接实现了这个接口。

七,状态会话Bean钝化时保存的内容

    ① EJB对象引用。

    ② Home对象引用。

 ③ EJB上下文的引用。

 ④ JNDI命名上下文。

八,激活和钝化的回调方法

    每个会话Bean都实现了SessionBean,所以每个会话Bean都有ejbPassivate()和ejbActivate()方法,EJB容器调用ejbPassivate()方法使Bean释放或处理占用的资源。调用ejbActivate()方法使Bean恢复在ejbPassivate()过程中释放的资源。

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值