Enterprise JavaBeans 介紹(一):EJB 種類介紹 (轉)

worldblog發表於2007-12-12
Enterprise JavaBeans 介紹(一):EJB 種類介紹 (轉)[@more@]

  (艾群科技 蕭松瀛) :namespace prefix = o ns = "urn:schemas--com::office" />

 

在今日已經逐漸的成為企業中標準的應用平臺,同時也

有許多的師,甚至網頁設計人員,利用 / 的便

利性,在 J2EE Server 上開發相關的應用,或是與公司內部的資源

相連線。

 

最近也有許多人慢慢的投入 J2EE 中的其它技術,其中 就是

一個很值得投資的技術。

 

這篇並不是要教您如何撰寫 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 實際上是針對 RMS 而設計,也就是說當其它的程式使

用Entity Bean 的時候, Entity Bean 的資料主要是從 而來,當

然,如果程式設計師熟悉 Entity Bean 的運作,那麼也可以很輕易的把

RDBMS 用其它的資料庫取代,像是 。

 

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 中需要自行宣告欄位來存放這些資料,同

時也要自行撰寫相關的程式程式碼,包括相關的 語法等等。

 

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 Map ,也就是常聽到的

一對一,一對多,多對多這種關係,在 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

很像,很容易上手。這個語法會被放置在 DD 之中,而 EJB Container

可以依照從 DD 取得的 EJB-QL 語法,自行產生與其它 CMP 的關聯。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-992200/,如需轉載,請註明出處,否則將追究法律責任。

相關文章