不吐不快之EJB中有无状态的Session Bean比较

通过上一篇《不吐不快之EJB演练——开篇概述》的介绍,我们已经知道EJB中的Session Bean 又分为有状态和无状态两种类型,那它们之间又有什么区别和联系呢?接下来我们将使用一个简单示例进行演示说明。

示例

1.编写有状态Session Bean接口

/**
 * 有状态Session Bean接口
 * @author Forrest
 *
 */
@Remote
public interface StatefulEjb {

	/**
	 * 进行内部计算的方法接口
	 * @param index
	 */
	public void compute(int index);

	/**
	 * 得到计算结果的方法接口
	 * @return 返回计算结果
	 */
	public int getResult();

}

2.编写有状态Session Bean实现

/**
 * 有状态Session Bean的实现类
 * @author Forrest
 *
 */
@Stateful
public class StatefulEjbBean implements StatefulEjb {

	private int state;

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

	@Override
	public int getResult() {
		return state;
	}

}

3.编写客户端调用的方法

public class StatefulEjbClient {
	/**
	 * 有状态Session Bean的测试客户端方法
	 * @param args
	 * @throws Exception
	 */
	public static void main(String[] args) throws Exception{
		InitialContext context = new InitialContext();
		//获得远程有状态Session Bean对象
		StatefulEjb statefulEjb1 =(StatefulEjb)context.lookup("StatefulEjbBean/remote");

		//调用调用Session Bean方法,打印成员变量并进行计算重新赋值变量
		for(int i=0; i<=6; i++){
			System.out.println(statefulEjb1.getResult());
			statefulEjb1.compute(1);
		}

		System.out.println("-------------------------------");

		//重新获取远程有状态SessionBean对象,模拟另一客户端执行
		StatefulEjb statefulEjb2 =(StatefulEjb)context.lookup("StatefulEjbBean/remote");
		for(int i=0; i<=6; i++){
			System.out.println(statefulEjb2.getResult());
			statefulEjb2.compute(1);
		}
	}

}

(注:无状态SessionBean的示例与给出的有状态Session示例代码基本相同,只是将实现部分的@Stateful注解换成@Stateless,JNDI远程访问做好对应即可。程序实现环境:MyEclipse10.7,JBoss5.0.0.GA)

执行结果:

有状态Session Bean客户端方法执行打印:

无状态Session Bean客户端方法执行打印:

通过上面的示例,我们可以发现访问有状态Session Bean,不同客户端打印的状态变量结果是不连续的,这说明EJB容器会为每一个客户端分配一个EJB实例,这个实例通过内部变量维护客户端的会话状态,但同时,通过代码我们也可以发现要达到这样的目的,客户端必须持有并维护对有状态Session Bean的引用。

对于无状态Session Bean,实际上是单例模式的一种体现,客户端每次在服务器端内存中访问的都是同一个对象,因此打印的结果是连续的。

总结

通过示例我们可以看到有状态的Session Bean像Http Session那样可以维护会话的状态,这虽然带来了一定的便捷性,但同时增加了EJB容器的负担:不仅要针对不同客户端实例化多个EJB对象,同时还要维护这些对象内部状态,因此降低了系统性能。而反观无状态的Session Bean,则没有此方面的性能问题。

查找资料介绍:应用有状态Session Bean的情况一般满足一下两个条件:

1.客户端的数量比较有限;

2.客户端与服务器之间会话状态信息比较多,较少的交予客户端自己维护就已足够。

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-02 02:21:16

不吐不快之EJB中有无状态的Session Bean比较的相关文章

不吐不快之EJB演练——开篇概述

EJB(Enterprise Java Bean)是J2EE规范的重要核心,它是一个用户分布式业务应用的标准服务端组件模型,它是一种可以快速开发大规模企业应用的组件体系结构.上面这样官方的解释可能对于刚开始接触EJB的人来说还是很晦涩,不过相信对于已经接触过J2EE规范的人来说,理解起来并不是很困难,J2EE制定出了一套规范,EJB是其中之一,它像JSP.Servlet等规范一样,在这里的定义也只是个模型.结构. EJB帮助我们解决了开发一个大型分布式企业应用底层那些系统级的问题(分布式事务.访

EJB(企业级JavaBean)之Session Bean

EJB是企业级JavaBean,是一种分布式的具体实现.EJB的企业Bean分为三种,分别是Session Bean(会话Bean).其中有分为Stateless Session Bean(无状态会话Bean).Statefule Session Bean(有状态会话Bean):Message Driven Bean(消息驱动Bean).Persistence(持久化)的Entity Bean(实体Bean).这篇主要讲解Session Bean 1.Session Bean 会话Bean的作用

【进阶EJB】深入探讨三种Bean(一)——Session Bean

接着,我们继续EJB的学习.经过前两篇博客的介绍,我想大家已经对EJB有了一个初步的认识.但是大家想过没有,我们为什么要用EJB呢? why EJB? 其中一个很重要的原因就是分布式!所谓分布式,就是分布式对象之间相互协作,完成特定的业务功能.通俗一点来说,就是我们不是把事情交给一个人去做,而是把事情划分一下,交给多个人去处理,最后把多个人处理的结果综合在一起得到最终的结果.与此同时,分布式对象之间能够实现分布透明性,亦或是位置透明性,即在客户端代码中无需指定分布式对象的位置:而且分布式对象之间

EJB学习(四)——Enterprise Bean(企业Bean)和Entity Bean(实体Bean)

    一.为什么使用EJB ? 企业Bean运行在EJB容器中,企业Bean实际上就是一个封装了业务逻辑的Java类,那么我们为什么要使用EJB呢 ? 1.最重要的原因:分布式.简要的说,分布式可以将分布在各处的资源综合利用,但是对于用户来说展现的是一个统一的整体:分布式可以动态分配任务,分散物理的和逻辑的资源,从而提高执行效率:分布式技术可以避免由于单个节点失效而使整个系统崩溃的危险. 2.分布式对象之间的事务支持,RMI(Remote Method Invocation,远程方法调用)不支

Java深度历险(二) EJB Session Bean有状态和无状态的区别与联系

刚开始对两种sessionbean存在误解,认为有状态是实例一直存在,保存每次调用后的状态,并对下一次调用起作用,而认为无状态是每次调用实例化一次,不保留用户信息.仔细分析并用实践检验后,会发现,事实恰好相反:有状态和无状态会话bean的本质区别是它们的生命期. 首先解释一个下面要用到的概念--用户:sessionbean 的用户实际上就是直接调用ejb的类的实例,甚至是这个实例的某个方法.同一个类的不同实例对于session bean来说是不同的用户. 实例解析 有状态的StatefulEjb

实例详解 EJB 中的六大事务传播属性--转

前言 事务 (Transaction) 是访问并可能更新数据库中各种数据项的一个程序执行单元 (unit).在关系数据库中,一个事务可以是一条或一组 SQL 语句,甚至整个程序.它有通常被称为 ACID 的原子性(Atomicity).一致性(Consistency).隔离性(Isolation).持续性(Durability)四大特性: 原子性(Atomicity):一个事务是一个不可分割的工作单位,事务中包括的诸操作要么都做,要么都不做. 一致性(Consistency):事务必须是使数据库

集成JPA+springmvc+spring+EJB中的Java EE应用

EJB是sun的JavaEE服务器端组件模型,设计目标与核心应用是部署分布式应用程序.凭借java跨平台的优势,用EJB技术部署的分布式系统可以不限于特定的平台.EJB (Enterprise JavaBean)是J2EE(javaEE)的一部分,定义了一个用于开发基于组件的企业多重应用程序的标准.其特点包括网络服务支持和核心开发工具(SDK). 在J2EE里,Enterprise Java Beans(EJB)称为Java 企业Bean,是Java的核心代码,分别是会话Bean(Session

EJB通过ANT提高EJB应用程序的开发效率、无状态发展本地接口bean、开发状态bean

该jboss集成到eclipse 关掉Jboss控制台新闻Ctrl+c,在MyEclipse→Servers→Jboss可配置JBoss. 通过ANT提高EJB应用的开发效率 在HelloWorld 增加ANT,右击项目新建xml:build.xml,右击打开方式选择Ant .. 相应用进行编译.打包.公布.解公布 <? xml version="1.0" encoding="UTF-8"? > <!--basedirz项目所在路径,.代表在bui

EJB3.0(三)JMS及EJB中的message-driven bean

为什么是这个标题呢?因为EJB的Message-driven bean基于JMS来实现的.在说明Message-driven bean之前需要来了解一下jms. JMS java-message-service,java程序和企业级应用交互的一套规范,定义一组用于创建.发送.以及接受消息的API.发送者不需要知道接受者的任何内容,接受者也是同样.对于双方都是一种透明的方式来进行异步交互.J2ee1.3版本开始支持JMS,而JMS主要提供了一种标准的底层消息通信的规范.JMS有两种消息模型,p2p