`
sysdeo
  • 浏览: 2440 次
  • 来自: ...
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

为什么要使用EJB?(转J道)

阅读更多
为什么要使用EJB?(转J道)
    首先,我们必须明确,为什么要使用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有性能问题”根本是一种缪误,具体可参考下面有关问题。
分享到:
评论

相关推荐

    ejb分离部署web工程可能要用到的包

    EJB通常与Web应用程序结合使用,提供业务逻辑处理,而Web应用程序则负责用户交互。本话题主要探讨在将EJB工程部署到JBoss应用服务器,以及Web工程部署到Tomcat应用服务器时,可能需要用到的包及其重要性。 首先,...

    EJB视频教程 3.开发EJB的客户端 4.把jboss集成进eclipse

    5. **日志和监控**:了解如何集成日志框架(如Log4j),以及使用JBoss管理工具监控EJB应用的运行状态。 6. **错误排查**:学习如何识别和解决在Eclipse中开发EJB应用时可能出现的各种问题。 通过本教程,开发者...

    j2ee ejb3.1

    - 鼓励开发者使用JAX-RS(Java API for RESTful Web Services)来构建RESTful服务,使得EJB组件可以直接暴露为REST接口,增强了与现代Web应用的集成。 在提供的文件中,`ejb-3_1-pfd-spec.pdf`可能是EJB 3.1规范的...

    远程调用EJB方法

    首先,在MyEclipse中创建一个新的Java项目,并命名为适当的名称,例如`EJB_Client`。 ##### 2. 导入必要的类库 接下来,需要将与EJB相关的类库导入到项目中。这包括: - `ejbca-ejb.jar`:由EJBCA编译后生成的JAR...

    Expert-One-on-one J2EE Development Without EJB.pdf

    《Expert-One-on-one J2EE Development Without EJB》是一本专为Java企业级应用开发者编写的书籍,旨在探讨如何在不使用Enterprise JavaBeans (EJB)的情况下进行J2EE开发。J2EE(Java 2 Platform, Enterprise ...

    tomcat调用EJB必须的包.rar

    1. **commons-logging.jar**:Apache Commons Logging是一个轻量级的日志记录抽象层,它允许应用程序选择它们想要使用的日志实现。在EJB和Tomcat的上下文中,这个库提供了统一的日志接口,使得开发者可以方便地切换...

    EJB入门(Java EE 8,使用企业JavaBeans构建应用程序)英文epub

    使用Java EE 8、Eclipse Java企业版( EE4J )、Web工具项目( WTP )和Microprofile平台构建强大的后端业务逻辑和基于复杂企业JavaBeans ( EJB )的应用程序。本书针对Java和Java EE开发人员(无论以前有没有EJB经验),...

    EJB与CORBA的交互例子,及源代码

    1. 处理日志信息打印的类:这个类可能实现了日志记录功能,如使用java.util.logging或log4j库,使得开发者能够追踪程序运行时的状态,方便调试和问题定位。 2. 格式化的字符串用于显示信息类:这类类通常用于格式化...

    EJB MDB JNDI配置信息

    本文将详细介绍不同应用服务器下的EJB MDB与JNDI配置信息,包括WebSphere、WebLogic、J2EE SDK、SilverStream、OC4J、JBoss以及WAS5等。 #### 二、JNDI配置基础 JNDI配置主要涉及两个核心属性:`Context.INITIAL_...

    ejb 3.0 jar 包 很全 part2

    `log4j.jar`:Log4j是一个广泛使用的日志记录框架,它允许开发者自定义日志级别和输出格式,为EJB 3.0应用提供了灵活的日志功能。 `xmlsec.jar`:XMLSec是一个开源库,用于XML安全相关的操作,如数字签名和加密。在...

    J2EE,EJB,J2EE,EJB,

    7. **EJB服务**:涵盖了Session Bean、Entity Bean和Message-driven Bean的实现和使用方法。 8. **Web服务**:讨论了Interstage的Web服务功能和开发,允许应用程序之间通过网络交换数据和服务。 读者需要具备的基本...

    EJB3.0所需jar文件(60多个)

    EJB3.0是EJB的一个重要版本,它引入了许多重大改进,使得EJB更加轻量级,易于使用,并且提高了开发效率。在EJB3.0中,开发者可以使用注解(Annotations)来简化部署和配置,从而减少了XML配置文件的使用。 这个...

    使用 Spring,JSF,EJB3 设计企业应用程序

    总之,Spring、JSF和EJB3的整合使用,为企业级应用开发提供了一种强大的解决方案。通过合理地划分和组织代码,可以构建出高可用、高性能的应用程序,同时保持良好的可扩展性和可维护性。开发者应熟练掌握这些技术,...

    struts1.1+ejb模拟项目

    10. **测试与调试**:学习使用JUnit对Action和EJB进行单元测试,以及如何使用日志工具(如Log4j)进行调试。 通过这个模拟项目,开发者可以深入理解Struts1.1和EJB在实际项目中的配合使用,提升在Java Web开发领域...

    一个关于EJB的实验报告........

    深入学习EJB,不仅要掌握其基本组件和生命周期,还要熟悉相关的API和工具,如JPA、JMS、JNDI等。同时,实践是提升理解的关键,通过实际项目应用EJB,可以更好地理解其在真实环境中的作用和优势。

    《EJB3.0实例子教程》jar包1

    《EJB3.0实例子教程》jar包1包含了多个重要的Java企业级开发库,这些库主要用于实现EJB(Enterprise JavaBeans)3.0规范,该规范是Java平台企业版(Java EE)的一部分,用于构建分布式、事务处理、安全性和可伸缩的...

    eclipse\Dom4j\EJB\J2EEJBoss\Juildeer\JSP\Log4j\Oracle\Structs\Tomcat\XML等语言的深层技术文档和学习资料。

    eclipse\Dom4j\EJB\J2EEJBoss\Juildeer\JSP\Log4j\Oracle\Structs\Tomcat\XML等语言的深层技术文档和学习资料。

    EJB培训时候的笔记

    **企业级JavaBeans (EJB) 技术...这些笔记将深入探讨EJB的核心概念、生命周期管理、异常处理以及与其它技术(如Spring、DOM4J和AJAX)的协同工作。通过学习这些笔记,你将能够掌握EJB技术,并在实际项目中灵活运用。

    org.hibernate.ejb-library-3.4.0.GA-A

    标题 "org.hibernate.ejb-library-3.4.0.GA-A" 指示这是一个与Hibernate相关的库,特别针对EJB(Enterprise JavaBeans)版本3.4.0,并且是为OSGi环境优化的。描述中提到它适用于在Virgo Jetty服务器上进行Web开发,...

    最新EJB 3.0实例教程

    - **注解驱动**: EJB 3.0大量使用注解,减少了XML配置,如`@Stateless`、`@Stateful`、`@Singleton`等。 - **实体bean的简化**: 无接口实体bean和自动的持久性管理。 - **依赖注入**: 通过`@EJB`、`@Inject`和`@...

Global site tag (gtag.js) - Google Analytics