`
xueyue521-qq
  • 浏览: 21657 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

对EJB3 Stateless和Stateful的认识

阅读更多
有状态无状态是和用户结合在一起理解和使用的,也就是是否有状态是相对于用户来讲的,比如下面代码:

package cn.edu.ustc.ejbs.impl;

import javax.ejb.Remote;

import javax.ejb.Stateless;

import cn.edu.ustc.ejbs.StatelessEJB;

@Stateless(mappedName = "StatelessEJBImpl")

@Remote

public class StatelessEJBImpl implements StatelessEJB{//定义一个无状态的会话bean

private int value=0;

public void sayHello(int value) {

System.out.println("Hello,your value is:" + value);

System.out.println("your last value is:" + this.value);

this.value = value;

}

}

package cn.edu.ustc.ejbs.impl;

import javax.ejb.Remote;

import javax.ejb.Stateful;

import cn.edu.ustc.ejbs.StatefulEJB;

@Stateful(mappedName = "StatefulEJBImpl")

@Remote

public class StatefulEJBImpl implements StatefulEJB{//定义一个有状态的会话bean

private int value=0;

public void sayHello(int value) {

System.out.println("Hello,your value is:" + value);

System.out.println("your last value is:" + this.value);

this.value = value;

}

}

客户端(用户)代码:

               InitialContext ctx=new InitialContext(); 

               StatelessEJB hello0 = (StatelessEJB) ctx.lookup("StatelessEJBImpl#cn.edu.ustc.ejbs.StatelessEJB"); 

               hello0.sayHello(1); 

               hello0.sayHello(2); 

               StatelessEJB hello1 = (StatelessEJB) ctx.lookup("StatelessEJBImpl#cn.edu.ustc.ejbs.StatelessEJB"); 

               hello1.sayHello(1); 

               hello1.sayHello(2); 

               StatefulEJB hello2 = (StatefulEJB) ctx.lookup("StatefulEJBImpl#cn.edu.ustc.ejbs.StatefulEJB"); 

               hello2.sayHello(1); 

               hello2.sayHello(2);

               StatefulEJB hello3 = (StatefulEJB) ctx.lookup("StatefulEJBImpl#cn.edu.ustc.ejbs.StatefulEJB"); 

               hello3.sayHello(1); 

               hello3.sayHello(2);

输出结果如下:

Hello,your value is:1

your last value is:2

Hello,your value is:2

your last value is:1

--

Hello,your value is:1

your last value is:2

Hello,your value is:2

your last value is:1

--------

Hello,your value is:1

your last value is:0

Hello,your value is:2

your last value is:1

--

Hello,your value is:1

your last value is:0

Hello,your value is:2

your last value is:1

可以看出有状态的会话bean在同一个类的实例访问的时候会保存上一次访问的状态,hello2和hello3是不同的两个实例,而容器会为不同的实例生成一个该实例唯一使用的会话bean,所以调用sayHello的结果是一样的。而无状态会话bean的状态(i)的值是无意义的,不管哪个实例访问都会改变i的值。

再来看看他们的定义:

有状态会话bean :每个用户有自己特有的一个实例,在用户的生存期内,bean保持了用户的信息,即“有状态”;一旦用户灭亡(调用结束或实例结束),bean的生命期也告结束。即每个用户最初都会得到一个初始的bean。

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

即不能以bean中有无属性等来区分是否有状态的,有状态无状态并非针对session bean中的状态(成员变量or属性)。

对于有状态会话Bean来说,只要有客户端发送对有状态会话Bean的访问,服务器都会创建一个会话Bean实例与该客户端对应,这样这个实例与这个客户端就是一一对应的。如果客户端在Bean实例中保存了信息,之后还可以使用。

而对于无状态会话Bean来说,服务器端会维持一个实例池,创建好若干个实例对象供客户端调用。当从客户端发送创建会话Bean的请求时,并不一定会真的创建 EJB,多数情况下是从实例池中得到一个实例,用完之后重新放回实例池。如果下次再访问,再从实例池中取出一个实例使用,并不一定是上次的实例。即使两次访问使用的是同一个实例,在两次访问之间也有可能有其他的客户端访问了该实例。所以,并不能保证在多次访问之间的信息会被保存。因此无状态会话Bean不会专门保存也没必要客户端的信息。是否有必要建立一个实例池?spring的singleton bean也能很好的满足不同用户的每次请求。以目前的知识了解个人暂且认为在session bean方法里面没有需要同步的地方时,没必要维持一个实例池。刚才了解到EJB3.1确实增加了singleton session bean。而在我的测试例子中,Stateless bean好像每次都是同一个实例,这样才会导致后面几次访问都能得到上一次访问中的值,跟singleton一样。

至于有状态和无状态的性能,因为有状态会话Bean需要保存特定客户端的信息,一个客户端对应一个实例,既是在当时客户端有连接没有访问的情况下,也要为这个客户端保留这个实例。这样随着客户端数量的增加,服务器端需要创建的实例的数量也在增加,增加到一定程度对服务器的性能就会有一定的影响。为了不对服务器的性能产生影响,通常服务器会进行一些优化。当客户端的数量超过某个值之后,就不创建新的实例。虽然不创建新的实例,还是需要对用户响应,这时候就采用共享实例的方式。会查看哪个 实例虽然处于连接状态,但是没有访问,然后把这个实例的状态保存起来,使用这个实例为新的请求服务,对于原来的客户端来说,称为挂起。如果原来的客户端又发送请求了,会重新查找一个空闲的实例并且把已经保存好的状态恢复回来,这个过程称为激活。所以在有状态会话Bean的访问过程,经常会发生查找实例,激活挂起等操作,所以效率比较低。而发送对无状态会话Bean的请求的时候,可以随便取一个空闲的实例为客户端服务,所以效率比较高。

有状态会话Bean的好处是,可以保存客户端的状态,所以客户端在后续访问的时候就可以少传递一些参数。而无状态会话Bean需要传递方法执行过程中需要的所有参数。

咱们自己用的时候可以根据上面分析的有状态会话Bean和无状态会话Bean的优缺点来决定。如果要频繁的访问,并且多次访问之间会共享一些信息,这时候应该使用有状态会话Bean。对于不经常使用的功能,可以使用无状态会话Bean。而无状态会话Bean的使用要比有状态会话Bean的使用多。
分享到:
评论

相关推荐

    EJB3入门例子

    4. **简化会话bean(Simplified Session Beans)**:EJB3的无状态会话bean(`@Stateless`)和有状态会话bean(`@Stateful`)更加易用,不再需要接口和Home接口,只需一个实现了业务逻辑的类即可。 5. **实体bean的...

    ejb3进阶案例

    总结,ejb3进阶案例涵盖了ejb3的核心组件,通过实践可以在理解ejb3特性的基础上,提升在JBoss 5上的应用开发和部署能力。通过深入学习和实践这些案例,开发者能够更好地掌握ejb3的精髓,从而构建出高效、稳定的企业...

    EJB3应用实例

    EJB3引入了许多重大改进,简化了开发流程,降低了对开发者的要求,使得它在企业级应用开发中变得更为实用和流行。 在EJB3中,最重要的特性包括: 1. **注解驱动**:EJB3摒弃了EJB2.x中的XML配置,大量使用Java注解...

    EJB3基础教程

    EJB3引入了丰富的注解,如`@Stateless`、`@Stateful`、`@Entity`、`@Table`等,使得开发者可以直接在类或方法上定义组件的行为和属性,减少了XML配置文件的使用。 ### 4. JPA与ORM Java Persistence API(JPA)是...

    EJB3 入门经典 源码

    1. **注解驱动(Annotation-Based)**:EJB3引入了注解,使得开发者无需编写大量的XML配置文件,如`@Entity`用于定义实体类,`@Stateless`或`@Stateful`用于声明无状态和有状态会话bean,`@PersistenceContext`和`@...

    EJB3 PPT教程

    这个PPT教程详细介绍了EJB3的各种核心概念和技术,旨在帮助学习者掌握EJB3的核心特性并能实际应用到项目开发中。** **一、SessionBean** SessionBean是EJB中的一个关键组件,它代表了业务逻辑,通常处理单个客户端...

    EJB3(入门经典简版)

    EJB3提供了角色为基础的安全性,允许开发者通过`@RolesAllowed`注解限制对bean方法的访问权限。 8. **EJB的生命周期** EJB的生命周期包括创建、初始化、激活、被动化、去活和销毁几个阶段,容器会自动管理这些...

    EJB3 实例练习(一)

    EJB3是EJB规范的一个重要版本,它在EJB2的基础上进行了许多简化和改进,使得开发更加高效且易于理解。在这个实例练习中,我们将探讨EJB3的基本概念、特性以及如何创建和运行一个简单的EJB3应用。 1. EJB3概述 EJB3...

    EJB3最新学习教程,适合初学者

    ### EJB3 最新学习教程知识点详解 #### 一、EJB3 概念与特点 **企业级JavaBean(EJB)**是Java平台的一部分,用于开发和管理基于组件的企业应用程序。EJB3(Enterprise JavaBeans 3)是EJB规范的一个版本,它大大...

    EJB3入门

    EJB3提供了多种会话Bean生命周期,包括无状态会话Bean(`@Stateless`)、有状态会话Bean(`@Stateful`)和单例会话Bean(`@Singleton`),分别适用于不同的业务场景。 7. **消息驱动Bean(Message-Driven Bean,MDB...

    jboss7ejb配置文件

    在JBoss 7及以上版本中,对EJB的配置过程相较于之前的版本有所变化,主要涉及到两个关键的配置文件:`jboss-ejb3.xml`和`ejb-jar.xml`。 `ejb-jar.xml`文件是EJB模块的标准配置文件,遵循Java EE规范。在这个文件中...

    大量EJB3文档(基本包含EJB所有技术资料)

    EJB3引入了@Stateless和@Stateful注解来声明这两种类型的Bean。 4. **消息驱动Bean(Message-Driven Beans, MDB)**:MDB用于处理JMS(Java Message Service)消息,是实现异步处理的一种方式。在EJB3中,只需使用@...

    EJB3实战的源代码

    例如,`@Stateless`、`@Stateful`、`@Singleton`注解分别用于定义无状态会话Bean、有状态会话Bean和单例Bean,`@Entity`注解标记实体Bean,`@PersistenceContext`和`@PersistenceUnit`注解用于管理数据访问。...

    ejb3_structs

    1. **注解驱动**:EJB3.0引入了注解,如`@Entity`, `@Stateless`, `@Stateful`, `@PersistenceContext`, `@EJB`等,允许开发者无需XML配置就能声明bean的角色和依赖关系。 2. **简化持久化**:通过JPA(Java ...

    Weblogic11g+EJB3的小例子

    这个例子对于初学者来说,是一个很好的实践平台,可以帮助理解EJB3在Weblogic 11g环境下的工作原理,以及如何构建和部署EJB3应用。通过研究和运行这个例子,开发者可以深入学习EJB3的核心特性,以及Weblogic服务器的...

    自己写了个ejb3的小例子代码 ( 之 四 )

    我们将通过两个具体的子文件——`pear.ejb3.mdb`和`pear.ejb3.session`,来了解EJB3中的Message Driven Bean(MDB)和Session Bean的概念。 首先,我们来看`pear.ejb3.mdb`,这代表Message Driven Bean,它是EJB3中...

    EJB 3 in Action

    书中详细讲解了如何定义和使用这两种类型的bean,包括注解驱动的API,如`@Stateless`和`@Stateful`,以及如何管理它们的生命周期。 实体Bean(Entity Bean)在EJB3中也经历了重大改革,不再需要编写大量的接口和...

    ejb3实例源代码

    EJB 3中的会话Bean分为无状态(Stateless)和有状态(Stateful)两种。无状态会话Bean适用于简单、无上下文的操作,而有状态会话Bean能维护客户端的会话状态。 3. **消息驱动Bean(Message-Driven Beans)**:处理...

    EJB3实战——Java

    根据给定的信息,“EJB3实战——Java”,我们可以推断出这篇文章主要关注的是EJB(Enterprise JavaBeans)3的相关知识及其在...通过对EJB 3 的深入了解和实践,可以帮助开发者更好地应对日益复杂的业务需求和技术挑战。

    EJB3+JBOSS5+JPA整合

    **JBOSS5**是一个开源的应用服务器,它实现了Java EE 5规范,包括对EJB3和JPA的支持。JBOSS5提供了一个运行环境,开发者可以在其中部署和运行EJB3应用。它包含了Web服务器、JMS(Java Message Service)、JTA(Java ...

Global site tag (gtag.js) - Google Analytics