paulwong

Entity Bean(1)

一、前言

從前面幾期的介紹,我們知道Enterprise JavaBean(EJB)J2EE架構中用來實作business tier的技術。就J2EE Design Pattern而言,business tier代表了MVC pattern中的modelmodel負責處理的是對business最重要的domain objectsbusiness logic。在這個脈絡下,J2EE Design Pattern建議我們使用session beanmessage-driven bean實作business logic,而以entity bean實作domain objects。透過使用entity bean,我們以物件模式塑模(modeling)business data,這不僅使我們可以運用物件導向程式設計的優點,也得以享受EJB Container提供的各種背景服務(PersistenceTransactionSecurityConcurrency)。本期及下一期我們將就entity bean的種類、生命週期、程式碼的實作、以及client端的使用對entity bean做一初步的介紹。後續的幾期我們將介紹entity bean的進階功能與相關設定。

二、Entity bean的種類

就資料保存(Data Persistency)的觀點而言,entity bean以物件模式保存資料只是各種資料保存模式中的一種。在實作中,entity bean除了接收來自clent端的資料外,主要還是從所謂的Enterprise Information System tier(EIS)取得既存的資料並將處理後的資料儲存在EIS tier,而關聯式資料庫(RDBM)則是目前最為普遍的EIS tier技術。面對不同的資料保存模式,如何在不同的tier之間維持資料的一致性與完整性(Data Interity)是個重要的課題。針對這個問題,EJB提供了兩種技術:CMP beanBMP beanBMP bean(Bean-Managed Persistence)將有關資料保存的工作交由開發人員負責,開發人員必須熟悉EJB Container呼叫call back 方法與其他bean life-cycle方法的時機與方式,並在BMP bean中實作與存取資料庫有關的程式碼。而CMP bean(Container-Managed Persistence)則將有關資料保存的工作交由EJB Container處理,開發人員不需要在entity bean中編寫有關存取資料庫的程式碼,而只需要在部署描述子(deployment descriptor)中定義好entity bean與資料庫之間的對應(mappings),在部署階段部署工具會自動產生相關的JDBC程式碼。這麼做的好處首先在於實際部署時得以動態產生entity beandata sources之間的繫結;更重要的是,它使開發人員得以專注於以物件導向的思維模式集中心力於business logic上。

EJB 1.1規格書中並沒有對CMP如何與資料庫schema之間的mappings提出一個標準的規範,此外對於如何建立多個entity bean之間的關係,如何尋找與定位(finding and locating)entity bean的做法亦付之闕如。但在EJB 2.0規格書中則對CMP做出了重大的改進,包括標準的Query Language(QL)Container-Managed Relationships(CMR)等,我們將在下期作進一步的介紹。以下是有助於選擇CMPBMP的因素:

1.       CMPBMP易於開發維護,EJB Container會對資料存取的過程做最佳化。

2.       BMP適用於對效能要求較高與較為複雜的應用程式,但若開發不當,則很容易拖垮系統的效能。

3.       CMP不支援較為複雜的SQL語法,如在where子句中對日期與時間的比較。

4.       CMP支援的data sources類型受container provider的限制。此外目前的CMP並不支援非JDBCdata sources

5.       如果要使用CMR,則必須使用CMP

三、Entity bean的生命週期

EJB Container運用集區(Pool)的概念來管理entity bean以妥善運用系統資源並增進系統效能。根據entity bean是否被放入集區與是否與EJB Object結合,entity bean有三種狀態:分別是Not Exist StatePooled StateReady State。下圖展示了EJB Container如何藉由呼叫bean classcall backlife-cycle方法在這三種狀態間轉換(下圖引用自Richard Monson-Haefel, Enterprise JavaBeans, 3rd Edition, O’Reilly,Page 308, Figure 11-2)

1.       Not Exist State

在這個狀態中,entity bean可視為一堆檔案的集合,這些檔案包括部署描述子、component interface,以及所有在部署階段產生的輔助classes。此時不存在任何entity bean instance

2.       Pooled State

EJB Server啟動後,它會讀取相關檔案,產生一些entity beaninstance。在產生entity bean instance後,EJB Container會呼叫entity beansetEntityContext()方法,將EntityContext物件賦予entity bean instanceEntityContext物件記載著該entity bean instance所在的EJB Container的狀態。在entity bean instance被賦予EntityContext後,就被放到集區中,進入Pooled State。此時的entity bean只有預設值,並不代表資料庫裡的任何資料。

有幾種情況可以使得在Pooled State中的entity bean instance離開集區並被資源回收。首先,EJB Server可視需要增加或減少集區中的entity bean instance,以有效利用系統資源並在效能上有較佳表現。其次,當停止EJB Server時,EJB Container也會釋放所有在集區中的bean instance。最後,當entity bean instance出現不可修復的錯誤時,EJB Container也會將之移出集區,並以集區中其他entity bean instance取代之。

entity bean instance被移出集區之後與被資源回收之前,EJB Container會呼叫其unsetEntityContext()方法,以通知該entity bean instance即將被毀滅。

3.       Ready State

client端呼叫entity beanhome interface上的create()方法時,EJB Server會產生一個EJB Object,並從集區中取出一個entity bean與之結合,此時entity bean進入Ready State。接著EJB Container會依序呼叫在entity bean instance上與create()對應的ejbCreate()ejbPostCreate()方法。當ejbPostCreate()方法執行完成後,create()方法會回傳一個EJB Objectreferenceclient端,此時entity bean instanceEJB Object就可以服務來自client端的請求。

前面介紹Pooled State時曾提到EJB Container為了有效利用系統資源,會視需要增加或減少集區中的entity bean instance,同樣地,EJB Container也會視需要在Pooled StateReady State之間移動entity bean instanceEntity bean instanceReady State移至Pooled State叫做Passivation過程,從Pooled State移至Ready State則叫做Activation過程。在Passivation過程中,EJB Container會呼叫entity beanejbStore()方法,將目前entity bean instance的資料寫回資料庫,再呼叫entity beanejbPassivate()方法通知該entity bean instance其即將被移回Pooled StateejbPassivate()方法執行完成後,entity bean instance就與EJB Object分離並回到Pooled State

Activation過程預設了某entity bean先前的Passivation過程。在Passivation過程結束後,原先與EJB Object結合的entity bean instance回到Pooled State,而EJB Object則維持其與client端的連線。一旦client再度呼叫EJB Object上的方法時,EJB Container就從集區中任意取出一entity bean instance與既存的EJB Object結合,繼續服務來自client端的請求。在這過程中,EJB Container呼叫entity beanejbActivate()方法,通知該entity bean instance準備更新來自資料庫的資料,再呼叫entity beanejbLoad()方法通知該entity bean instance資料已經重新寫入,準備服務來自client端的請求。

最後一種從Ready Stateentity bean instance移回Pooled State的情況是client端呼叫EJB ObjectEJB Home上相關的的remove方法時,EJB Container會呼叫entity bean上的ejbRemove()方法,此時系統會刪除資料庫中與該entity bean instance相對應的資料。ejbRemove()方法執行完成後,該entity bean instance就被移回Pooled State

posted on 2008-12-04 11:30 paulwong 阅读(285) 评论(0)  编辑  收藏 所属分类: J2EE


只有注册用户登录后才能发表评论。


网站导航: