`

有状态bean和无状态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()过程中释放的资源。
分享到:
评论

相关推荐

    ejb有状态bean和无状态bean

    本篇将深入探讨有状态Bean和无状态Bean的概念、区别以及它们的应用场景。** **1. 无状态会话Bean (Stateless Session Beans)** 无状态会话Bean是最基础的EJB类型,它不维护任何客户端会话状态。每次客户端调用方法...

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

    - **会话Bean (Session Bean)**:分为有状态和无状态两种,用于封装业务逻辑操作。 - **消息驱动Bean (Message-Driven Bean)**:处理JMS(Java Message Service)消息。 ### 2. 有状态会话Bean (Stateful Session ...

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

    无状态Bean适用于短暂的、不涉及客户端状态的交互,而有状态Bean则适用于需要持久化客户端状态的场景。在实际开发中,要根据业务逻辑、性能需求和资源管理等因素进行权衡,以选择最适合的解决方案。

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

    实战EJB之三开发会话Bean(有状态会话Bean) ...有状态会话Bean是EJB中的一个重要组件,可以在客户引用期间维护Bean中的所有实例数据的状态值,开发有状态会话Bean需要正确地理解其生命周期和开发过程。

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

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

    Java EJB中有、无状态SessionBean的两个例子.rar

    SessionBean分为两种主要类型:有状态(Stateful Session Beans,SSB)和无状态(Stateless Session Beans,SSB)。这两个概念是Java EE开发者必须掌握的核心知识。 1. 有状态SessionBean(Stateful Session Bean)...

    ejb状态bean和消息bean的源代码

    状态Bean和消息Bean在实际应用中常常结合使用。例如,一个在线购物系统可能使用状态Bean来跟踪用户的购物车状态,而消息Bean则用于处理后台的订单处理流程,如库存检查、发货通知等。通过这种方式,状态Bean负责与...

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

    本文档将详细介绍如何使用Java Business Components (JBX) 和 WebLogic Server (WLS) 开发一个有状态会话Bean(Stateful Session Bean)的具体实例。在这个实例中,我们将构建一个模拟在线购物车的功能,该购物车...

    EJB,有状态,无状态,实体bean笔记,及例子

    EJB规范定义了三种主要类型的bean:无状态session bean、有状态session bean和实体bean,每种类型都有其特定的用途和生命周期。 1. **无状态Session Bean** 无状态session bean是最基础的EJB类型,它们不维护任何...

    EJB3.0无状态SessionBean例子

    总结,EJB3.0无状态SessionBean的例子展示了如何利用注解简化开发流程,以及如何通过本地和远程接口进行组件间的通信。理解并掌握这些概念对于构建可扩展、健壮的企业级Java应用至关重要。通过学习这个示例,开发者...

    EJB状态bean和消息bean的演示

    上一个资源的演示版,EJB状态bean和消息bean的演示

    Java EJB中有、无状态SessionBean的两个例子

    Java EJB中有、无状态SessionBean的两个例子,的无状态SessionBean可,会话Bean必须实现SessionBean,获取系统属性,初始化JNDI,取得Home对象的引用,创建EJB对象,计算利息等;  在有状态SessionBean中,用累加...

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

    了解并掌握无状态会话 Bean 的开发和使用,是成为合格的 Java 企业级开发者的重要一步。 以上就是关于“EJB3 开发第一个无状态会话 Bean”的详细解析,希望对您理解和实践 EJB3 技术有所帮助。如果您想了解更多有关...

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

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

    基于java的开发源码-EJB中有、无状态SessionBean的两个例子.zip

    基于java的开发源码-EJB中有、无状态SessionBean的两个例子.zip 基于java的开发源码-EJB中有、无状态SessionBean的两个例子.zip 基于java的开发源码-EJB中有、无状态SessionBean的两个例子.zip 基于java的开发源码-...

    ejb3 第6讲--开发具有本地接口的无状态bean

    EJB3提供了多种bean类型,包括无状态会话bean、有状态会话bean、消息驱动bean和实体bean。 2. **本地接口** 本地接口是bean暴露给客户端调用的一种方式,它不需要远程通信,因此比远程接口更高效。在EJB3中,我们...

    Eclipse+Jboss EJB技术 会话Bean

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

Global site tag (gtag.js) - Google Analytics