(艾群科技 萧松瀛)
J2EE 在今日已经逐渐的成为企业中标准的应用程序平台,同时也
有许多的程序设计师,甚至网页设计人员,利用 JSP/Servlet 的便
利性,在 J2EE Server 上开发相关的应用,或是与公司内部的资源
相连接。
最近也有许多人慢慢的投入 J2EE 中的其它技术,其中 EJB 就是
一个很值得投资的技术。
这篇文件并不是要教您如何撰写 EJB ,但是希望让对 EJB 有兴
趣的使用者,能够大致了解 EJB 能让您作哪些事情。
EJB 依照特性的不同,目前区分为三种,分别是 Session Bean ,
Entity Bean ,以及 Message Driven Bean 。其中 Session Bean 与
Entity Bean 算是 EJB 的始祖,这两种 EJB 在 EJB 规格 1.x 的时候
就已经存在了,而 Message Driven Bean 则出现在 EJB 2.0 的规格中
。目前也有少数几家厂商的 J2EE Server 支持 EJB 2.0 的规格。
Session Bean
Session Bean 主要的目的是让程序开发者将逻辑层抽离,特别是复
杂的逻辑可以放在 Session Bean 中。Session Bean 还可以再细分为
Stateful Session Bean 与 Stateless Session Bean ,这两种的 Session Bean
都可以将系统逻辑放在 method之中执行,不同的是 Stateful Session
Bean 可以记录呼叫者的状态,因此通常来说,一个使用者会有一
个相对应的 Stateful Session Bean 的实体 (Instance 注一) ,换言之,
当使用者呼叫某个 Stateful Session Bean 的两个 methods 的时候,
EJB Container(注一) 会清楚的知道某个 EJB 的实体属于某一个使用
者的。因此一般的设计上,不会让两个使用者同时使用某个 Stateful
Session Bean (这并不是表示两个使用者不能使用同一个 Stateful Session
Bean)。
Stateless Session Bean 虽然也是逻辑组件,但是他却不负责记录使
用者状态,也就是说当使用者呼叫 Stateless Session Bean 的时候,
EJB Container 并不会找寻特定的 Stateless Session Bean 的实体
来执行这个 method ,换言之,很可能数个使用者在执行某个 Stateless
Session Bean 的 methods 时,会是同一个 Bean 的 Instance 在执行。
从内存方面来看, Stateful Session Bean 与 Stateless Session
Bean 比较, Stateful Session Bean 会消耗 J2EE Server 较多的内存,
然而 Stateful Session Bean 的优势却在于他可以维持使用者的状态。
Entity Bean
Entity Bean 主要是资料组件, Entity Bean 主要的目的,在于提供资
料,也就是说程序设计师可以将 Entity Bean 当程序资料,至于 Entity
Bean 实际上怎么存取实际上的数据库,那个则是另外一件事情。
Entity Bean 实际上是针对 RDBMS 而设计,也就是说当其它的程序使
用Entity Bean 的时候, Entity Bean 的资料主要是从 RDBMS 而来,当
然,如果程序设计师熟悉 Entity Bean 的运作,那么也可以很轻易的把
RDBMS 用其它的数据库取代,像是 LDAP 。
Entity Bean 主要区分为 Bean-Managed Persistence 以及 Container-
Managed Persistence (简称 BMP 及 CMP) ,这两种 Entity Bean 的型
态不同,但是目的相同,都在于提供资料!这两种 Entity Bean 主要的
差别在于维护资料的角色, BMP 是由 Bean 自行维护资料的一致性,
而CMP 则是由 EJB Container 来维护。一个 Entity Bean 往往代表一张
RDBMS 的表格,这个表格内的一笔一笔的资料,则是透过另外一个
叫做 Primary Key(注三) 的 Class 来加以区分。
Bean-Managed Persistence
当我们说 BMP 是由 Bean 自行维护资料的一致时,有些人会觉得太过
于抽象,简单一点来说,原来的资料均由数据库而来,而当资料从资
料库中取出之后,在 BMP 中需要自行宣告字段来存放这些资料,同
时也要自行撰写相关的程序代码,包括相关的 JDBC 语法等等。
Container-Managed Persistence
CMP 是比较高阶的 Entity Bean ,比较高阶的意思是说,撰写 CMP 的
程序设计师并不需要撰写大多数的 JDBC 语法,只需要透过一些定义
,即可产生 CMP ,实际上的 EJB 的程序代码则是 EJB Container 依据相
关的 Deployment Description (注四) 在部署(注五) EJB 的时候产生。
BMP 与 CMP 的型态不同,适用的场合也不同,主要的差异在于如果
我们想要自行控制所有的动作,那么应该使用 BMP , BMP 允许程序
设计师完全的控制 BMP 的资料存取行为,而 CMP 很适合快速开发,
但是由于要支持 CMP 的 J2EE Server 需要较高的技术,因此每一家对于
CMP 的支持程度也不大相同。
此外,数据库中有一个很重要的关系是 OR Mapping ,也就是常听到的
一对一,一对多,多对多这种关系,在 EJB 1.x 的规格中,这种一对多
的对应关系只有两种方式可以做出,一种是透过 Session Bean 来存取
多个 Entity Bean ,另外一种则是透过 BMP 来控制另外数个 BMP 或是
CMP ,但是在 EJB 2.0 的规格中,已经可以透过纯粹的 CMP 配合
EJB-QL(注六) 语法来做出这种对应关系,这也是 EJB 2.0 的一大特色。
Message Driven Bean
Message Driven Bean 与 Session Bean 或是 Entity Bean 均不相同,
一般 Session Bean 或是 Entity Bean 都可以让使用者主动触发(可以
在需要的时候,呼叫他们的 method 来触发他们),但是 Message Driven
Bean 主要的目的在于反应 Message Queue 中的事件。
也就是当 Message Queue 中有讯息传入时, Message Driven Bean 可
以主动被触发,做出相对应的反应。因此如果说 Session Bean 与 Entity
Bean 是同步模式的 EJB (使用者呼叫某个 Method ,就只能等 EJB 响应
之后才能进行下一步),那么 Message Driven Bean 就可以当成是专门处
理异步资料格式的 EJB ,也就是说程序设计师将某个讯息丢入 Message
Queue 之后,就继续执行下去,另外一方面, Message Driven Bean 会
受到通知,知道有某个讯息需要处理,这时候他会自行运作。
因此 Message Driven Bean 并不是直接给使用者呼叫的,而是透过 Message
Queue 来触发。
如果您对 EJB 有兴趣,可以参考 Sun 的教育训练课程 SL-351 。
注一:
Bean Instance 表示在内存中实际上产生的对象,一个 Bean Class
可以产生多个 Bean Instance 。Bean Instance 才是真正执行 EJB
method 的对象,可想而知的是, Instance 的数量越多,耗去的内存
越多。
注二:
EJB Container 是负责执行 EJB 的地方,所有 EJB 的产生,或是消灭
,或是执行等等,均透过 EJB Container 来处理。当使用者呼叫某个
EJB 的时候,实际上也是透过 EJB Container 来执行。
注三:
在 RDBMS 中,一张 Table 可能会有相关的 Primary Key 的字段,而
Entity Bean 中也有相对应的 Class 来表示这个 Primary Key ,譬如
如果数据库中,某个 VARCHAR 字段是它的 Primary Key ,那么
Entity Bean 中则可以用 String 来表示这个 VARCHAR 字段。
注四:
Deployment Description 是一种 XML 格式的文件(简称 DD),这个文件
用来描述 EJB 的种类,型态,以及相关的资料。 EJB 的运作中,也
以 DD 内的描述为主。
注五:
部署是一个动作,一个写好的 EJB 并不能单独执行,他必须被"置放"
到EJB Container 之后才能够运作,这个置放的动作,我们叫做部署。
部署的动作相当复杂,但是对使用者来说很可能是按个按钮即可以完
成。
注六:
EJB-QL 是一种查询 EJB Instance 的特殊语法,语法格式与 ANSI SQL
很像,很容易上手。这个语法会被放置在 DD 之中,而 EJB Container
可以依照从 DD 取得的 EJB-QL 语法,自行产生与其它 CMP 的关联。