`
tangkuo
  • 浏览: 103281 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
文章分类
社区版块
存档分类
最新评论

无状态与有状态会话Bean

 
阅读更多
现实中,很多朋友对两种session bean存在误解,认为有状态是实例一直存在,保存每次调用后的状态,并对下一次调用起作用,而认为无状态是每次调用实例化一次,不保留用户信息。仔细分析并用实践检验后,你会发现,事实恰好相反:
有状态和无状态会话bean的本质区别是它们的生命期。
首先解释一个下面要用到的概念--用户:session bean 的用户实际上就是直接调用ejb的类的实例,甚至是这个实例的某个方法。同一个类的不同实例对于session bean 来说是不同的用户。
有状态会话bean :每个用户有自己特有的一个实例,在用户的生存期内,bean保持了用户的信息,即“有状态”;一旦用户灭亡(调用结束或实例结束),bean的生命期也告结束。即每个用户最初都会得到一个初始的bean。
无状态会话bean :bean一旦实例化就被加进会话池中,各个用户都可以共用。即使用户已经消亡,bean 的生命期也不一定结束,它可能依然存在于会话池中,供其他用户调用。由于没有特定的用户,那么也就不能保持某一用户的状态,所以叫无状态bean。但无状态会话bean 并非没有状态,如果它有自己的属性(变量),那么这些变量就会受到所有调用它的用户的影响,这是在实际应用中必须注意的。


1.无状态会话Bean
      从字面意思来理解,无状态会话Bean是没有能够标识它的目前状态的属性的Bean。例如:
    public class A {
       public A() {}
       public String hello() {
          return "Hello 谁?";
       }
    }

    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的实例都是相同的,可以被不同的客户端重复使用。

   2.状态会话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("中国");
          System.out.println(a.hello());
          B b = new B("世界");
          System.out.println(b.hello());
       }
    }

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

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

   5.状态会话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没关系。

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

   7.状态会话Bean钝化时保存的内容如下:
       a.EJB对象引用。
       b.Home对象引用。
       d.EJB上下文的引用。
       e.JNDI命名上下文。

   8.激活和钝化的回调方法:
      每个会话Bean都实现了SessionBean,所以每个会话Bean都有ejbPassivate()和ejbActivate()方法,EJB容器调用ejbPassivate()方法使Bean释放或处理占用的资源。调用ejbActivate()方法使Bean恢复在ejbPassivate()过程中释放的资源。
分享到:
评论

相关推荐

    EJB3 示例有状态和无状态会话bean

    有状态会话Bean保持了与客户端的会话状态,这意味着它可以记住客户端在一系列交互过程中的状态。每个客户端请求都会被映射到一个特定的SSB实例,允许bean在多个方法调用之间存储和管理数据。在EJB3中,实现SSB通常...

    实战EJB之三 开发会话Bean(有状态会话Bean).doc

    实战EJB之三开发会话Bean(有状态会话Bean) 本文主要讲解了有状态会话Bean(Stateful Session Bean)的概念、特点、生命周期和开发过程。下面是相关知识点的总结: 1. 什么是有状态会话Bean? 有状态会话Bean...

    关于有状态和无状态会话bean的解释

    当客户端与有状态会话Bean交互时,它会创建一个实例,并在整个会话期间保持该实例,直到客户端结束会话或者显式地将其注销。这使得有状态会话Bean能够跟踪和维护用户会话中的数据,如购物车信息、用户偏好等。 有...

    ejb有状态bean和无状态bean

    有状态会话Bean与无状态Bean的主要区别在于它们能保留客户端会话状态。当客户端首次与有状态Bean交互时,服务器会为该客户端创建一个专用实例。这个实例会记住客户端的所有交互信息,直到客户端结束会话或Bean被...

    无状态会话Bean实验指导.doc

    【无状态会话Bean实验指导】的文档主要涵盖了如何开发和测试无状态Session Bean的步骤,这是企业级JavaBeans(EJB)技术的一部分,属于...这有助于理解和验证无状态会话Bean的功能,并为以后的EJB学习和应用打下基础。

    Eclipse+Jboss EJB技术 会话Bean

    在EJB中,会话Bean分为两种类型:无状态会话Bean(Stateless Session Bean)和有状态会话Bean(Stateful Session Bean)。无状态会话Bean不保留任何客户端特定的信息,每次调用都是独立的。而有状态会话Bean则可以...

    实验一 开发环境安装、配置及无状态会话Bean的创建

    实验一 开发环境安装、配置及无状态会话Bean的创建 在本实验中,我们将学习如何安装和配置 JBoss 服务器,配置 MyEclipse 环境,创建及测试 EJB3 无状态会话 Bean。本实验将帮助我们掌握 JBoss 的安装与配置,掌握...

    Jboss下开发ejb应用之一会话bean的应用

    会话Bean可以是无状态的或有状态的,无状态会话Bean通常用于处理一次性请求,而有状态会话Bean则保存了与客户端交互的上下文信息。 1. **无状态会话Bean**: - 无状态会话Bean不维护与客户端的特定关系,每次调用...

    Bean开发实例之二有状态会话Bean开发实例

    ### Bean开发实例之二:有状态会话Bean开发实例 #### 概述 本文档将详细介绍如何使用Java Business Components (JBX) 和 WebLogic Server (WLS) 开发一个有状态会话Bean(Stateful Session Bean)的具体实例。在这...

    EJB3开发第一个无状态会话bean

    **EJB3 开发第一个无状态会话 Bean 知识详解** 无状态会话 Bean(Stateless Session Bean)是企业级 Java(EJB)3.0 中的核心组件,主要用于实现业务逻辑,它不保存任何特定客户端的状态信息。本篇文章将深入讲解...

    实验6-无状态会话bean.pdf

    【实验6-无状态会话bean】主要涉及的是Java企业级应用开发中的核心概念——无状态会话Bean(Stateless Session Bean),这是Java EE(Java Platform, Enterprise Edition)规范中的重要组成部分,主要用于处理业务...

    实验6-无状态会话bean.docx

    【实验6-无状态会话bean】是关于Java企业级应用开发的一个实践环节,主要涉及的是EJB(Enterprise JavaBeans)中的无状态会话bean。无状态会话bean是一种服务器端组件,它不保存任何会话状态信息,每次调用都是独立...

    使用JBoss 4.2书写EJB3.0无状态会话Bean + JPA + MySql 5.0的Hello World Java EE应用

    环境:Window XP profession, JDK 1.6, MySQL 5.0, JBoss...该示例使用EJB 3.0的无状态会话Bean呼叫JPA持久层完成数据库的操作,推荐广大企业级Java程序员项目中使用。 注意:连接池的配置参见上一个资源readme.txt文档

    EJB 会话BEAN PPT

    1. **避免过度使用有状态会话Bean**:有状态会话Bean可能会导致内存消耗增加,因此,除非确实需要维护状态,否则应优先考虑无状态会话Bean。 2. **利用注解简化开发**:EJB3.0引入了注解,减少了大量XML配置,使...

    PAS(Primeton Application Server)企业版EJB开发案例分析:有状态/无状态会话Bean与CMP/BMP实体Bean

    主要包括有状态会话Bean (Stateful Session Bean) 和无状态会话Bean (Stateless Session Bean),以及容器管理持久化实体Bean (CMP Entity Bean) 和Bean管理持久化实体Bean (BMP Entity Bean) 的开发过程。...

    J2EE快速进阶培训-(PPT)

    无状态会话bean适合执行不依赖于会话状态的独立操作,而有状态会话bean则保留了与特定客户端交互的历史信息,为同一客户端多次调用提供一致性。 综上所述,这个J2EE快速进阶培训课程全面覆盖了J2EE的核心技术,包括...

    JAVAEE7 有状态会话bean项目

    JAVAEE7 有状态会话bean项目,源代码,EJB3.2,JSF2.2,stateful sessionBean(环境:netbeans8.1,NetBeans自带glassfish4.1,JDK7) 可以用于初学者学习有状态会话bean 下载后,解压,直接导入netbeans8.1即可

    EJB3.0源代码,包含会话Bean,实体Bean,还有消息Bean

    - **有状态会话Bean (Stateful Session Beans)**: 能够保持与特定客户端会话的状态,通常用于管理购物车或游戏状态等场景。 2. **实体Bean (Entity Beans)** - **容器管理的持久性 (Container-Managed ...

Global site tag (gtag.js) - Google Analytics