EJB动态访问多个数据库_第1页
EJB动态访问多个数据库_第2页
EJB动态访问多个数据库_第3页
EJB动态访问多个数据库_第4页
EJB动态访问多个数据库_第5页
已阅读5页,还剩8页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、EJB动态访问多个数据库EJB (Enterprise JavaBean)是J2EE的一部分,定义了一个用于开发基于组件的企业多重应用程序的标准。其特点包括网络服务支持和核心开发工具(SDK)。在J2EE里,Enterprise Java Beans(EJB)称为Java 企业柄,是Java的核心代码,分为整体柄和片段柄和消息柄三个部分,其中的消息柄将在以后再作讨论。现在我们来看看什么是整体柄和片段柄。整体柄是一种对象: 标准Java对象由创建它的程序创建,当程序终止时,对象也随之丢失,这就意味着当再次运行些程序时,将无法找到先前创建的柄,而整体柄会一直存在着直到它被删除。 一个程序可以创建一

2、个整体柄,并且这个程序可以在被保存后随时停止和重启。整体柄将会依然存在。重启后,程序可以找到与之相对应的整体柄,并且会继续使用这个整体柄。EJB实际上是SUN的J2EE中的一套规范,并且规定了一系列的API用来实现把EJB概念转换成EJB产品.EJB是BEANS,BEANS是什么概念,那就是得有一个容纳她,让她可劲造腾的地方,就是得有容器.EJB必须生存在EJB容器中.这个容器可是功能强大之极!她首先要包装你BEAN,EJB的客户程序实际上从来就不和你编写的EJB直接打交道,他们之间是通过HOME/REMOTE接口来发生关系的.它负责你的BEAN的所有的吃喝拉萨睡,比如BEAN的持续化,安全性

3、,事务管理.一.什么是 EJB?一个技术规范:EJB 从技术上而言不是一种"产品"EJB 是一种标准描述了构建应用组件要解决的:可扩展 (Scalable)分布式 (Distributed)事务处理 (Transactional)数据存储 (Persistent)安全性 (Secure)二.Sun 对 EJB 的期望提供一个标准的分布的、基于 OO 的组件架构屏蔽复杂的系统级功能需求Write once, run anywhere与非 Java 应用之间的互操作能力兼容 CORBA 标准三.为什么选择 EJB?EJB 服务器完成"繁杂"的工作:应用开发人

4、员关注于业务逻辑的实现而不是底层的实现机制(类似于 4GL 语言设计的目标)支持事务处理多个业务操作同时成功,或全部失败可以通过在代码外的描述来定义事务处理级别可扩展性EJB 可以根据您应用的增长而扩展EJB 服务器往往还提供了负载均衡和安全性:由 EJB 服务器提供资源的访问权限控制四.EJB 架构为了满足架构的目标,规范中描述了服务器 (Server)容器 (Container)类 (Class) 和实例 (Instance)Home 和 Remote 接口客户端 (Client)五. 简化的编程模型关注于业务逻辑实现:EJB 负责生命周期 (lifecycle), 数据存储(persis

5、tence), 事务处理语义 (transactional semantic), 安全(security), .通用的编程模型:各种服务的高层 APIJava 是其编程语言1.EJB 特点由一个 EJB 容器在运行时创建和管理 EJB在部署 EJB 时定制其运行方式由 EJB 容器和服务器来协调客户端的访问可以部署到任何兼容的 EJB 容器中客户端对 EJB 的视图是由 Bean 开发人员决定的2.EJB 服务器管理 EJB 容器 (它管理 Bean)提供对操作系统服务的存取提供 Java 相关的服务,尤其是通过 JNDI 访问命名空间基于 OTS 的事务处理服务3.EJB 容器管理 Bean

6、 生命周期:将 EJB 服务器提供的服务传递给 Bean 生成代码来实现对 Bean 的存取访问强制事务处理的限制创建、初始化和回收 Bean管理持久数据的存储对客户端而言 EJB 容器是透明的4.在一个 EJB 服务器中的容器目前容器通常是由 EJB 服务器本身提供的在 EJB 1.0 或 1.1 规范中没有定义容器-到-服务器的接口 各厂商可以根据他们的见解来实现服务器和容器的各自责任5.容器提供服务: 数据存储容器决定何时载入/储存状态Container-Managed Persistence(容器管理存储/CMP)容器负责存储您的 Bean容器生成必要的类和代码Bean-Managed

7、 Persistence(Bean 管理存储/BMP)Bean 开发人员提供存储代码开发人员决定 如何存储, 容器仍然决定 何时进行6.容器提供服务: 事务处理可以由容器代理来实现容器将得到业务逻辑方法的事务处理需求容器提供事务控制代码也可以由程序员通过代码实现7.容器提供服务: 其它服务其它服务包括命名 (Naming)安全 (Security)线程管理 (Thread management)这些服务由容器代理完成将减少应用开发人员的负担8.分布式对象运算远程对象被作为本地对象来处理:传递信息的方式不变,但开销更大Enterprise JavaBeans 永远运行在服务器上:对 Bean 的

8、访问永远是远程调用9.Stub 和 Skeleton由 EJB 生成:"Stub" 对要传递出去的信息编码"Tie/Skel" 将接受到的信息解码并传递给目标对象10.分类: Enterprise JavaBeans+-Entity Beans-CMP/BMPEjb-|+-Session Beans-Stateful/Stateless会话 Bean (Session Bean):根据 EJB 规范,一个会话 Bean 是:代表单个客户端来执行可以参与到事务处理中不直接代表共享于数据库中的数据,但它能访问和更新这些数据相对而言是短暂存在的当 EJB 容器

9、失效后就不存在客户端需要重新建立一个信新的会话对象来继续运算实体 Bean (Entity Bean):根据 EJB 规范,一个实体 Bean 是:提供在数据库中数据的对象视图允许被多个用户共享存取访问可以是长期存在 (只要它存在于数据库中)实体 Bean, 它的主键对象, 以及它的远程引用将能跨 EJB 容器的宕机而存在11.EJB 类和实例构建 EJB 应用包括来自三方的代码开发人员编写的代码由 EJB API 定义的类和接口由容器自动生成的代码开发人员编写的代码包括Bean 类 (定义了业务逻辑)Home 接口 (如何查找或创建 bean)Remote 接口 (如何存取 bean)其它组

10、件,根据 bean 实际要求12.EJB Home 接口每个 bean 有一个用于:创建新的 bean 实例、查找现存的 bean (只能是实体 bean)Remote 接口:定义 bean 的公共接口只有在 Remote 接口中定义的方法才能被客户端访问EJB 客户端可以为 servlet, JSP, 应用程序或其它 bean通过 JNDI 来查找 EJB home 接口,步骤为:创建一个 JNDI Context (initial context)使用 JNDI Context 来查找 bean home 接口使用 bean home 接口来创建/查找 bean 实例使用 bean 实例完

11、成业务操作实际的存取 (对 EJB) 是通过容器生成的类来完成EJB 架构客户端对 bean 访问永远不是直接的EJBObject (tie) 是由容器自身提供的:用来帮助管理 bean 的生命周期EJB 中的角色EJB 服务器供应商: 开发并销售 EJB 服务器EJB 容器供应商: 开发并销售 EJB 容器Enterprise bean 开发人员: 开发并销售 EJB应用组装人员: 将不同的 EJB 搭建成应用六、EJB的体系结构目前,EJB最新的标准是2.1,EJB3.0规范正在讨论中,预计将于明年推出。EJB2.1定义了三种企业Bean,分别是会话Bean(Session Bean),实

12、体Bean(Entity Bean)和消息驱动Bean(MessageDriven Bean)。Session Bean用于实现业务逻辑,它可以是有状态的,也可以是无状态的。每当客户端请求时,容器就会选择一个Session Bean来为客户端服务。Session Bean可以直接访问数据库,但更多时候,它会通过Entity Bean实现数据访问。Entity Bean是域模型对象,用于实现O/R映射,负责将数据库中的表记录映射为内存中的Entity对象,事实上,创建一个Entity Bean对象相当于新建一条记录,删除一个Entity Bean会同时从数据库中删除对应记录,修改一个Entity

13、 Bean时,容器会自动将Entity Bean的状态和数据库同步。MessageDriven Bean是EJB2.0中引入的新的企业Bean,它基于JMS消息,只能接收客户端发送的JMS消息然后处理。MDB实际上是一个异步的无状态SessionBean,客户端调用MDB后无需等待,立刻返回,MDB将异步处理客户请求。这适合于需要异步处理请求的场合,比如订单处理,这样就能避免客户端长时间的等待一个方法调用直到返回结果。调用一个EJB组件要比调用一个JavaBean麻烦些,由于EJB组件可以分布在多台服务器上,因此必须首先获得远程或本地Home接口,然后使用Home接口创建EJB之后就可以调用E

14、JB的方法了。七、EJB设计模式常见EJB设计模式SESsion Facade pattern通常项目中,客户端往往需要频繁的对服务器端数据进行操作。当采用实体EJB作为数据的抽象层时,如果直接让客户端程序与实体EJB交互,会产生实现一个业务需求便需要大量的EJB属性操作(如下图1)。这直接导致如下问题:网络负载大(远程客户端时)、并发性能低、客户端与服务器端关联度大、可重用性和可维护性差、性能因此有必要在客户端与实体EJB层间加入Session EJB层,在Sessino EJB中实现商业逻辑并封装对实体EJB的操作。(如下图2)图1:客户端直接与实体EJB交互图2:通过SessionEJB

15、层实现Session Facade模式的好处是:降低了网络负载,SessionEjb可以调用实体EJB的本地接口;将商业逻辑与商业数据隔离;维护与开发方便;显著提高性能。Session Facade模式因其简单使用,是目前使用很广的模式。但具体应用过程中应注意:避免将所有的操作封装到一个很大的SessionEJB内;服务器端数据结构应由实体EJB实现,除非特例否则避免直接的数据库操作;SessionEjb内某些系统通用操作的代码容易重复(比如权限检查等,解决办法是将系统通用服务封装在Java Class内)。MesSAge Facade Pattern很多时候,一次RequeST需要操作多个E

16、JB又不需要得到即时返回。对这种异步调用,通常应用Message Fa?ade Pattern.这种时候,如采用Session Fa?ade Pattern存在如下问题:1. 客户端等待返回的时间过长。一个SessionEjb的实例在完成客户请求过程中中涉及到的每一次对其他实体Ejb的调用过程中都会被锁定直到得到实体EJB返回信息后才能进行下一步操作。这样造成客户不必要的等待,并很容易因时间导致整个事务失败。2. 系统可靠性和容错性低。如果需要调用不同系统或服务器上或多个异构数据源的多个EJB时,任何一个环节出错,均导致客户请求失败。以Message-Driven Bean为基础的Messag

17、e Facade Pattern则可以解决上述异步请求需求。具体架构见下图3图3:使用Message Facade PatternMessage Facade Pattern的不足之处在于:1 Message-Driven Bean没有返回值。这样通知客户执行结果只能依赖于EmAIl或人工等其他手段。2 Message-Driven Bean执行过程中无法将捕获的异常直接返回给客户端,即无法使客户端直接直到错误信息。3 Message-Driven Bean通过接收Message响应客户请求,对Message内容的合法性(比如对象的类型等)依赖与客户端.容易产生运行时错误。Message Fa

18、cade Pattern经常与Session Facade Pattern在同一个项目里共同使用。EJB Command PatternSession Facade Pattern中将商业逻辑实现封装在Session EJB中,这种做法带来诸多益处之外也带来如下问题:1 由于业务经常的变化,导致经常需要更新Session EJB代码。2 客户端代码不得不包含大量EJB相关的API,不利于后期项目维护。3 项目开发测试需要经常的EJB重部署过程。引起上述问题的重要根结就是Session EJB本身重量级组件,其开发测试部署工作量较大,开发周期较长。以上不足可以通过EJB Command Patt

19、ern克服。EJB Command Pattern中将商业逻辑实现封装在普通的Java ClASs(称之为Command Bean)中。该模式的具体实现有很多种,通常的框架都包括三部分:1 Command Bean.由应用开发者写的具体实现某商业操作的Java Class.主要包含getXXX(),setXXX(),exECute()方法。2 Client-Side Routing Logic.由多个Class组成,用于将请求转发至Command Sever,这个过程对客户是透明的。这部分代码可以跨项目使用。路由规则中可以考虑用XML技术。3 Remote Command Server.实际执

20、行商业操作请求。通常可以用Session EJB层实现。整个框架见下图4:图4:Command的基本框架EJB Command Pattern具有如下好处:1 适应与需要快速开发环境。因Command Bean是轻量级的Java Class,其编译和调试比较方便。2 将表现层与商业实现层隔离,同时将客户端代码与EJB层隔离。3 将客户端代码开发与服务器端代码开发相对清晰。早期可以创建空的Command Bean方便客户端代码调试。EJB Command Pattern的弱处在于:1 Command Bean中对事务的控制不如Session EJB中。2 Command Bean是无状态的。3

21、无法将异常直接返回给客户。4 在大项目中,由于商业逻辑复杂,常导致大数量的Command Bean存在.5 作为Command Server的Session EJB打包时必须包含Command Bean以致存在维护上的不便。EJB Command Pattern的一个实际实现可以参考IBM's Command framework.Data Transfer object Factory基于EJB的J2EE项目,经常需要在客户端与服务器端传输大量数据。数据的组织形式常用的是DTO(Data Transfer Object,服务器端数据对象的抽象)。但因为客户端表现层经常是变化的,所需要服

22、务器端数据也变动频繁,换句话说,DTO的数量和属性经常要更改。因此如何以及在何处生成和维护DTO便是需要考虑的问题。一种解决方案是直接在Entity EJB中直接处理,即在Entity EJB的Bean类中加入getXXXDTO()、setXXXDTO()等。但这样做导致EJB与DTO层紧紧绑定。一旦DTO更改,与该DTO相关的EJB即需要重编译打包。EJB层与客户端层相关联不仅使维护困难而且导致EJB的重用性大大降低。更好的解决方案是利用Data Transfer Object Factory封装对DTO的操作逻辑(如下图6)。图6:DTO Factory示例DTO Factory具体实现方

23、式通常有两种:1 普通Java Class实现,用于Session Facade Pattern使用DTO环境下。2 Stateless Session EJB实现,用于非EJB客户端使用DTO环境下(见图7)。图7:SessionEJB实现DTOFactoryDTO Factory带来如下好处:1 使Entity EJB的重用成为可能。由于不含DTO处理逻辑,Entity EJB功能单一化,只作为数据源。不通客户端通过各自的DTO Factory可以从同一个Entity EJB得到各自所需的个性化数据(自定义DTO)。2 提高可维护性和性能。3 可以根据在DTO Factory层生成很复杂的

24、DTO结构,诸如继承、关联关系等,而对客户端提供一个透明、细化的数据接口。使用DTO Factory时需要注意的是:不需为每个Entity EJB定义一个Factory。可以为一系列相关的Entity EJB创建一个Factory,或者只创建一个Factory。Generic Attribute Access使用Entity EJB作为商业数据层时,我们首先需要从数据库加载数据,创建对应的Entity EJB实例,之后对内存中Entity EJB实例的属性进行相应操作。对属性的操作比较直接的做法是:直接调用Entity EJB的getXXX()/setXXX(),通常利用EJB2.0的本地接口

25、;通过DTO Factory生成DTO。但这两种做法都存在如下问题:1 当Entity EJB的属性特别多时候,以上做法会带来复杂罗嗦的代码,使EJB变的庞大无比。2 使Entity EJB的客户端(比如Session EJB)和Entity EJB的接口紧密关联。Entity EJB属性的增删都需要更改客户端代码,给项目开发和维护带来不便。事实上可以利用更通用的方式访问Entity EJB的属性,即定义Generic Attribute Access Interface。见下图8:图8:Generic Attribute Access Interface示例Generic Attribute

26、 Access Interface由Entity EJB的本地或远程接口实现,并利用Hash Maps传输数据。实现方式常见如下:1 BMP类型实体EJB可以在Bean类中定义包含所有属性的私有成员变量HashMap。2 CMP类型实体EJB可以在Bean类中可以适用Java Reflection API实现。3 建立一个父类,在不同的情况下定义子类重载父类方法。使用Generic Attribute Access Interface需要在客户端与服务器端对属性以及对应的关键字建立统一的命名习惯。常见的做法如下:1 建立并保持良好的文档记录和命名约定。2 在实体EJB的实现类中定义静态成员映射

27、属性。3 创建共享静态类,通过成员变量映射实体EJB属性。4 通过JNDI在服务器端保存属性映射关系。Generic Attribute Access Interface的运用带来一下益处:1 接口实现后对不通实体EJB都适用。2 对属性较多实体EJB能精简代码,并更具维护性。3 使运行中动态增删实体EJB属性成为可能。Generic Attribute Access Interface的缺点在于:1 访问EJB属性时增加了额外的操作。需要通过关键字映射属性,最后还需进行类型转换。2 需要建立客户端与服务器端的命名约定。3 因为通过HashMap操作时候需要进行类型转换,容易产生运行时类型不匹

28、配异常。Business InterfaceEJB规范要求Bean实现类必须实现所有在远程(或本地)接口中定义的所有方法,同时不允许Bean实现类直接继承远程(或本地)接口。这就导致编译时候很容易产生两者不一致的问题,即远程(或本地)接口中定义的某方法为在Bean实现类中被实现等错误。为避免上诉错误,可以利用应用服务器厂商所提供的工具。但也可以应用EJB的设计架构来实现:定义商业接口。Business Interface即创建自定义商业接口,在接口中定义所有EJB提供的商业方法,并让Bean实现类和远程(或本地)接口都实现该商业接口。其继承关系见下图9:图9:商业接口的使用Business I

29、nterface是个普通的Java Class。依赖于使用本地接口与远程接口的不通,Business Interface的定义略有不同:应用与远程接口时,在接口中的方法需要抛出java.rmi.RemoteException;而应用与本地接口时候则不需要作任何特别处理。应用Business Interface时候必须注意一点:EJB规范不允许直接EJB的实例将对自己的引用(this对象)返回给客户端,否则编译时候即报错。但使用Business Interface后,编译时候无法检查出有无将this对象返回给客户端。这一点需要程序员自己保证。三 内部数据转换策略Data Transfer Obj

30、ect基于EJB的J2EE多层架构应用中,经常涉及的一个问题就是如何在各层之间传递批量数据,比如客户端对服务器端数据的批量读写操作等。比如需要得到实体EJB的属性,直接的方法是多次调用不通的属性,如下图10:图10:低效的数据传递方式但这种方法容易导致许多问题,比如性能以及代码的复杂度等,更有效的办法是在一个调用中得到所有需要的属性。所以可以引入Data Transfer Object来封装所需要的属性,并在客户与服务器端通过传递该对象一次实现对数据的操作。如下图11:图11:通过DTO传递数据DTO为普通的Java Class,通常是服务器端数据的快照。由于网络传输的需要,DTO应该实现ja

31、va.io.Serializable接口。DTO的设计有两种模型:Domain DTO以及Custom DTO。Domain DTO仅仅实现对服务器数据的拷贝,通常与实体EJB为一对一的关系(也存在为多个相关联的实体EJB对应一个Domain DTO)。Domain DTO通常除用于读取更改实体EJB属性外也可用于创建实体EJB时候。实体EJB与Domain DTO对应关系如下图12:图12:Account EJB 与 Account DomainDTODomain DTO的应用除了DTO所具有的一般优点外,还有别的益处:1 开发迅速。因为一旦实体EJB设计好后,很容易转换得到Domain D

32、TO。2 可以利用Domain DTO的setXXX()方法在客户端进行属性有效性效验。 Domain DTO的缺点有:1 客户端绑定了服务器端数据模型,不利于维护。2 不够灵活,无法处理客户端的多样化数据要求。对一个数百个属性的实体EJB请求一个属性时候却返回一个包含所有属性值的Domain DTO明显是笨重的实现。3 导致代码的重复。4 Domain DTO中如果嵌套包含了别的Domain DTO时,一旦需服务器端数据的更改而需要重定义Domain DTO模型时候异常困难。Custom DTO则可以克服上述的一些缺点。Customer DTO仅仅封装用户感兴趣的服务器数据集即可以根据客户端需求创建Customer DTO。这样作的优点是灵活高效;缺点是大项目中可能导致大量的Customer DTO存在。通常Domain DTO可以用于数据的更新与创建;Customer DTO可以用于客户用于表现层的数据读取。两者可以相辅相成。而且使用DTO一般与DTO Factory同时使用。Domain Transfer Hash MapDTO的使用往往缺乏通用性。不通的用户案例需要创建不同的DTO。当项目很复杂时,从维护性考虑需要更好的数据传输的实现方式。Domain Transfer Hash Map即利用HashMap作为客户所需数据集的封装。好处是:1 良好的维护性

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论