`

为啥要用EJB

    博客分类:
  • EJB
 
阅读更多

首先,我们必须明确,为什么要使用J2EE?J2EE优点是什么?使用J2EE的主要原因是多层结构,传统的两层C/S结构难于维护,稳定性极差,界面代码和数据库代码混淆在一起,牵一动百,多层结构使得界面和数据库完全分离,并且诞生了中间件这样的技术,如下图:

Web+EJB能组成真正的多层结构

  为什么使用EJB我原先认为这不是一个讨论的话题,因为EJB是J2EE重要的组成部分,可以说没有EJB的J2EE只是一种Web系统,这样的系统非常容易丧失了多层结构的大部分优点(仔细想想那些混合多种层次功能JavaBeans和传统两层结构有什么区别?)。

  当然,可以人为地在Javabeans之间进行层次划分,例如Hibernate算数据持久层,某些 JavaBeans是业务核心层,但是因为都是普通JavaBeans,这种划分没有一种强制性和明显标志性,这样的系统更换了主创人员或设计师,可能就 会被新的程序员修改得非常混乱。

  我们先看看一个包含EJB的J2EE系统是如何清晰地表达层次。如下图:

  Web完全只是一个MVC模式的实现,关键业务核心是在EJB的服务层实现,这样做的优点是,Web只负责界面相关部分,因为,如果是一个智能客户端,如Swing或J2ME,在不需要修改任何业务核心的情况下能够方便地更换。同样,提供Web Services功能,也只是在 Web层修改,不会涉及EJB方面的修改,同样保证了系统的稳定性,保证了系统升级和未来的扩展性。

  如果不使用EJB,在EJB服务层实现的业务核心将由普通JavaBeans实现,使用何种架构或设计能够保证负责MVC的JavaBeans和负责业务核心的JavaBeans清晰地分开,又如何保证在新的程序员不会破坏和打乱你精心布局的JavaBeans架构?

EJB提供性能优化支持

  最主要的是性能问题,由于以前国内中文Java网站有些人弯曲EJB,认为EJB性能低,其实这是一种非常肤浅错误的认识,我们首先看看在一般Java环境中是如何提高性能。

  假定一个JavaBeans为A,那么一般使用这个JavaBeans命令如下:

  A a = new A();

  但是,在高访问量的环境中,new A()其实是很费时消耗系统性能的,因此,能不能在软件系统启动时候就预先建立一些对象,这样,系统运行时,从这些已经生成的对象池中借用一个,这样,就 无需在使用时进行New,节约了开销,提高了性能,因此,真正成熟性能解决方案都是需要对象池等支持。

  在一个纯Web结构的系统(也就是只能运行在Tomat环境中),例如Struts + Hibernate等这样的系统,除非自己动手做,一般是没有对象池技术支持的,因此他们的性能只能算是Demo演示版本的性能,根本无法承受大容量并发 访问,也无法称为一个成熟的系统,所以,我们研究成熟的开源Web系统,如Jive、OFBize,LifeRay等,他们都在Web层拥有自己的对象池 和缓存池。

  对象池和缓存机制是J2EE必须的吗?当然,是所有成熟系统必须的,Windows系统如果去掉缓存将会变得怎样?

  自己动手开发对象池和缓存机制并不是一件简单的事情,需要对多线程以及同步锁等底层原理有深层次的把握,这其实也是一门非常深入的Java研究分支,所以,你可以抛开你的客户焦急的催促,精心研究开发自己的对象池和缓存池。

  但是,EJB容器(如JBoss)已经提供了对象池和缓存机制,所以,没有事务机制的无状态 Session Bean的性能肯定要强于普通JavaBeans。EJB容器不但在单机中提供了对象池和缓存,而且可以跨服务器实现动态负载平衡,这些都无需开发者自己 开发任何软件代码,结构如下:

EJB组件能提供真正的可重用框架

  每一个jar包代表一个EJB组件,一个系统可以由多个可重用的EJB组件构成,例如:树形结构EJB组件;自增序号EJB组件;用户资料EJB组件等,这样的EJB组件可以象积木一样搭配在大部分应用系统中,提高了系统的开发效率,保证了开发质量。

  下图是某个新的具体系统时应用到的EJB组件图,在这个新的应用中,由于使用了以前大量可重用的EJB组件,新的开发工作基本集中在界面设计和流程安排上:

EJB提供了事务机制

  事务机制对于一些关键事务是很重要的,例如ATM机提款,提款有多个动作:修改数据库以及数钱等,如果这其中有任何一个环节出错,那么其它已经实现的操作必须还原,否则,就会出现,提款人没有拿到钱,但是卡上已经扣款等不可思议的事情发生。

  EJB提供的事务机制非常周全,但事务机制带来的缺点是性能的降低,因此,有些人认为EJB很重,因为在 实际应用中,有的用户系统可能不需要事务机制,只是需要EJB提供的性能优化机制,这样,如果使用EJB,就象叫一个人来背东西,他除了背着我要的东西 外,还背着我不要的东西。

  除非你是一个完美主义,在一般企业应用或数据库系统应用中,EJB不会对你构成很重的包袱。

CMP独特的优点

  开源以及一些数据库持久层技术崇拜者,一直抨击CMP,认为CMP慢无用,实际最大的问题是他们的设计和使用问题。

  由于EJB容器(如JBoss)对CMP实现有事务机制的缓存优化,因此,CMP特别适合多个用户同时更 新同一个数据源的情况,CMP这种严格的事务完整性保证多个用户同时操作一个数据记录时,能够保证性能优化和数据的完整性,如果这个数据记录是是软件系统 的状态标志,它的状态会影响系统中很多的环节,那么状态更改的重要性不言而喻。

  如果没有事务完整性支持,你的软件系统在用户访问量变大,就会变得发生各种不可能发生的逻辑错误,查看程序逻辑是正确的,那么问题出在哪里?出在数据完整性上。

  由于每个CMP在内存中都有一个缓存,在实际应用中,如果使用CMP批量读数据库数据,几万条查询完毕, 内存中充满了几万条CMP缓存,如果这时你的EJB容器设置不当(如使用JBoss缺省配置),那么JVM的垃圾回收机制就会频繁启动,导致你的系统变慢 甚至死机,这也是一些人抨击CMP慢的原因所在,其实他们使用方法不当,或者没有正确配置EJB容器CMP缓存。

  对于这种情况,根据J2EE核心模式,推荐使用DAO+JDBC方式。

小结

  除非你对设计模式非常精深,能够将自己系统中的JavaBeans使用模式或某种框架进行固定分层,同 时,你孜孜不倦研发出对象池,又熟练于JTA等事务机制,你可以选择没有EJB的纯Web结构,就象Jive、OFBiz那样。当然还有一个前提,老板不 懂或者非常有挑战性(做与IBM SUN 微软齐名的公司和技术)。

  不要再被TSS那些狂热的开源先生误导,他们有时间有保障可以做他们喜欢的事情,作为专业的J2EE程序员,按照J2EE标准去学习去行动,也不要认为,只要使用了J2EE其中某个技术如Jsp或JavaBeans就心安理得认为自己的系统是J2EE了。

  当然,我并不是说纯Web系统不能实现多层结构,但是至少在很多方面没有Web+EJB结构完善和清晰,所以,EJB不是J2EE可以忽视的部分,而是主要的重要的部分,重要业务功能核心都封装在EJB中,相反Web层是一种次要的、和界面相关的层次。

  补充:什么情况下不需要EJB,在SUN的SECA架构师试卷中回答:小型系统和不需要事务。另外过去那种认为“EJB有性能问题”根本是一种缪误,具体可参考下面有关问题。

相关文章:

Java实用系统开发指南

OO + 分布式计算 = 软件架构的方向

J2EE集群原理

为什么需要有态Session Bean

When to not use EJB

关于SPING与EJB的胡言乱语--重和轻永恒的话题

数据库已死

Spring 和EJB终于统一融合

EJB专题

分享到:
评论

相关推荐

    实战EJB 实战EJB 实战EJB

    3. **配置部署描述符**:使用`ejb-jar.xml`文件指定EJB的部署属性。 **部署到应用服务器** 1. **打包**:将EJB类及其依赖项打包成`ejb-jar`文件。 2. **配置**:在应用服务器中配置EJB的部署信息。 3. **部署**:...

    pafa中使用ejb

    标题中的“pafa中使用ejb”指的是在Pafa(可能是某个特定的软件或框架的缩写)中集成和使用Enterprise JavaBeans(EJB)的技术。EJB是Java EE(现在被称为Jakarta EE)平台的一部分,它提供了一种标准的方式来创建可...

    EJB方面 ejb pdf

    理论上任何Java类都可能被视为一个Bean,但在实践中,JavaBean通常具备无参数构造函数,并实现了`Serializable`接口以支持持久化。JavaBean类似于COM模型中的本地进程内组件,不具备跨进程访问能力。 - **...

    实战角度比较EJB2和EJB3的架构异同

    例如,一个无状态Session Bean在EJB3中可以用以下代码表示: ```java package example; @Stateless public class TestSessionBean implements TestSessionLocal { public void xxxx() { System.out.println(...

    java的ejb.jar包

    javax.ejb.AccessLocalException.class javax.ejb.CreateException.class javax.ejb.DuplicateKeyException.class javax.ejb.EJBContext.class javax.ejb.EJBException.class javax.ejb.EJBHome.class javax.ejb....

    EJB集群EJB集群资料

    `@Clustered`注解是关键,它告诉JBOSS服务器要将此Bean部署为集群的一部分。 集群配置涉及到多个JBOSS服务器的设置。在这个例子中,JBOSS 4.0.5 GA被安装在两个不同的IP地址(192.168.1.88和192.168.1.99)上,并且...

    javax.ejb.jar下载

    Files contained in javax.ejb.jar: META-INF/MANIFEST.MF javax.ejb.AccessLocalException.class javax.ejb.AccessTimeout.class javax.ejb.ActivationConfigProperty.class javax.ejb.AfterBegin.class javax....

    ejb2.0与ejb3.0的区别

    企业Java Beans(EJB)是Java平台为企业级应用提供的一种组件模型。随着技术的发展,EJB经历了多个版本的迭代,其中EJB 2.0和EJB 3.0是两个重要的里程碑版本。本文将详细阐述这两个版本之间的主要区别。 #### 二、...

    ejb3.0写的登陆应用

    EJB(Enterprise JavaBeans)3.0是Java企业级应用开发的一个重要版本,它极大地简化了EJB的使用,降低了开发复杂性,并引入了许多新特性。在这个“ejb3.0写的登陆应用”中,我们可以深入探讨EJB 3.0在实现登录应用中...

    EJB3 PPT教程

    了解如何正确使用`find()`、`persist()`、`merge()`和`remove()`方法是学习EJB3的重点。 **六、EJB3-QL(Java Persistence Query Language)** EJB3-QL是JPA的查询语言,类似于SQL,但更加面向对象。你可以学习如何...

    javax.ejb.rar

    META-INF / maven / org.glassfish.main.ejb / javax.ejb / pom.properties META-INF / maven / org.glassfish.main.ejb / javax.ejb / pom.xml javax.ejb.AccessLocalException.class javax.ejb.AccessTimeout....

    EJB3.0规范-EJB3.0 SPECIFICATION

    1. **注解驱动(Annotation-based)**:EJB3.0弃用了XML配置文件,转而采用注解来声明实体Bean、会话Bean和消息驱动Bean的元数据。这使得代码更加简洁,减少了配置文件的维护工作,例如`@Entity`、`@Stateless`、`@...

    EJB基础(学习EJB者必看)

    对于想要深入理解EJB的开发者来说,"EJB基础(学习EJB者必看)"这个资源应该涵盖了EJB的基础概念、设计模式以及实际应用。 EJB基础学习中,首先会介绍EJB的基本类型,包括会话bean(Session Beans)负责处理客户端...

    Idea搭建EJB架构Demo项目源代码

    【标题】"Idea搭建EJB架构Demo项目源代码"涉及的是使用IntelliJ IDEA(简称Idea)这个强大的Java集成开发环境来构建一个基于EJB(Enterprise JavaBeans)架构的示例项目。EJB是Java EE(企业版)平台的核心部分,...

    EJB原理图:EJB工作原理

    - **功能**:当一个EJB部署到容器中时,容器会为该EJB创建一系列的对象来支持其运行。具体来说,对于每个EJB,容器至少会创建以下三个对象: - **EJB对象**:这是实际的业务逻辑实现,比如这里的`HelloBean`。 - *...

    ejb+hibernate资料 ejb+hibernate资料

    EJB(Enterprise JavaBeans)和Hibernate是两种在Java企业级应用开发中广泛使用的技术。EJB是Java EE(Java Enterprise Edition)的一部分,主要用于构建可扩展的、安全的、事务处理的分布式应用程序。而Hibernate则...

    EJB教程,EJB参考书

    4. **编译和部署**:编译源代码并打包成`ejb-jar`文件,然后使用EJB容器的工具进行部署。 5. **编写客户端程序**:创建客户端代码来调用EJB的服务,通常通过查找和引用EJB的远程接口完成。 #### 示例:HELLO应用 ...

    EJB中ejb-jar——xml文件说明.pdf

    EJB中ejb-jar文件配置详解 EJB(Enterprise JavaBean)是一种Java技术,用于开发企业级应用程序。EJB容器提供了许多功能,如事务处理、安全认证、资源管理等,以便开发者更方便地开发企业级应用程序。在EJB中,ejb-...

    使用ejb2.0 ql教程代码

    在这个"使用ejb2.0 ql教程代码"中,我们将会探讨EJB 2.0中的查询语言(QL)及其在实际应用中的使用。 EJB QL(Enterprise JavaBeans Query Language)是EJB 2.0引入的一种面向对象的查询语言,它允许开发者根据对象...

Global site tag (gtag.js) - Google Analytics