指南:设计 Enterprise JavaBeans(EJB)
该指南讨论了如何为 J2EE 应用程序设计 Enterprise JavaBeans(EJB)。
关系
相关元素
主要描述

介绍

本指南着重于设计 EJB。工作产品指南:EJB 提供关于 EJB 的更多指导信息,例如如何确定 EJB 以及对 EJB 建模。

以下指南中提供关于设计特定类型的 EJB 的指导信息:

本地接口与远程接口

概念:J2EE 概述:Enterprise JavaBeans 中描述了本地接口和远程接口。

本地接口比远程接口更为有效。如果存在始终处于 EJB 本地的特定客户机,则应提供本地接口。

特定类型的 EJB 的指南中提供了关于该主题的更具体指导信息。

参数传递

远程调用数量和每个调用中传送的数据量会大大影响性能。这可通过提供特定调用来处理,这些调用返回远程客户机所要求的所有数据。例如,充当一组相关实体 Bean 的外观的会话 Bean 可将多个实体 Bean 中的数据复制到连续的值对象中,并在单次远程调用中返回这些数据。核心 J2EE 模式 - 值对象模式([ALU01])中详细描述了这种情况。

这必须通过尽可能保持接口通用性和避免发送过多的不必要数据来取得平衡。

事务

划分事务意味着启动、提交和放弃事务。EJB 设计人员必须决定是实施由 Bean 管理的事务划分还是实施由容器管理的事务划分。您必须决定业务逻辑序列中由应用程序执行的事务边界的位置。关于更多信息,请参阅任务:用例设计,对事务建模以及概念:J2EE 概述中标题为事务管理的部分。

在可能的情况下使用由容器管理的事务。这将使代码保持简单,并允许开发人员着重于应用程序的业务逻辑。

一般而言,事务越细分,整体性能就越好。假设您对 EJB 进行一系列方法调用(例如,getX、getY 和 getZ)。缺省情况下,每个方法都将在一个新事务中执行,导致性能降低。要在同一事务中调用这些方法,则创建另一方法(例如会话 EJB 的方法 processXYZ),并将所调用方法的事务属性设置为 Required,这样,它们就使用现有的事务(即,会话 Bean 中的调用方法的事务)。 

安全性

概念:J2EE 平台概述 - 安全性中涵盖了基本 EJB 安全性概念。

您通过定义安全角色方法权限来定义 EJB 的安全需求。安全角色和方法权限是在 EJB 的部署描述符中定义的。将安全角色映射到用户还是用户组,这取决于服务器(使用管理工具)。 

安全角色定义一组相似类型的活动,这些活动是使用单个名称组织起来的。方法权限向特定安全角色赋予调用方法的权限。例如,对于方法 setAddresssetSalary 等考虑实体 EJB Employee。 安全角色管理员可能被赋予方法 setAddress 和 setSalary 的方法权限,而安全角色员工可能仅被赋予方法 setAddress 的方法权限。  

在某些情况下,使用部署描述符中声明的方法权限是不可能支持应用程序的安全需求的。在这种情况下,使用 javax.ejb.EJBContext 接口的 getCallerPrincipal 和 isCallerInRole 方法。 

计时器服务

由于 J2EE 1.4(更准确的说,是 EJB 2.1)无状态会话 Bean 和消息驱动的 Bean 可使用计时器来安排 EJB 计时器服务中批处理流程的时间。

EJB 计时器服务提供的方法可允许针对基于时间的事件来安排回调的时间。容器为计时事件提供了可靠的事务通知服务。计时器通知的发生可安排在特定时间,在一段特定持续时间之后或是在特定的重现时间间隔内。

计时器服务是由 EJB 容器实施的,且 Enterprise Bean 可通过 EJBContext 接口访问该服务。

EJB 计时器服务是一项粗略的计时器通知服务,旨在用于应用级流程的建模,而不是实时事件的建模。

直接访问与实体 Bean

对持久数据使用实体 Bean,提供了访问持久数据的、富有特性的标准机制。可对客户机隐藏决定使用由 Bean 管理的持久性还是使用由容器管理的持久性,这为设计工作提供了某种灵活性。EJB 可利用事务、资源管理、负载平衡以及 J2EE 环境提供的其他特性。

但是,可能有些情况下您想直接访问数据库并避免使用实体 Bean。例如,如果单个客户机对数据始终进行只读访问,那么直接访问数据库将更有效。

如果您直接访问数据库(例如,从无状态会话 Bean),则封装“数据访问对象”类中的所有数据库访问。这仅仅是一个 Java 类,它隐藏和封装基本存储机制,并在数据源接口更改的情况下分隔更改。请参阅核心 J2EE 模式 - 数据访问对象模式([ALU01])。

数据库连接

实际上,所有 EJB 容器均提供对连接共用(共享一组已创建的客户机间连接)的支持。这些连接按需要分配给 EJB。EJB 无需创建并初始化连接即可获得连接。连接返回到池中后,它就被回收。池应足够大,以提供足够的连接来回收使用过的连接。

对于由容器管理持久性的实体 Bean 而言,容器管理着数据库连接和对数据库连接池的访问权。

对于由 Bean 管理持久性的实体 Bean(或访问数据库的会话 EJB 或消息驱动的 EJB)而言,开发人员负责对连接例程编码。以下指南适用于:

  • 隔离 DAO 类中的数据库访问代码。
  • 不要对数据库的实际 URL 硬编码,相反地,使用可由 Java 命名和目录接口(JDNI)查找操作检索到的逻辑名称。这允许您在多个应用程序中重用 EJB,可能使用不同的数据库名称。
  • 一般而言,使用连接池;只要需要连接,就只维持该连接。例如,实体 Bean 可能连接、更新表中的某一行,然后断开连接。这将允许多个 EJB 共享同一连接。JDBC 规范包括了对连接共用的支持。