表格型的關系型數據庫與樹型java對象之間的映射問題是一個至今爭論不休的問題,好在現在已經有了一些好的解決方案。在本文中,我們將介紹EJB技術是怎樣用自已特定的方式來解決這個問題的。
只要是涉及到保存及查詢信息 ,那絕大多數應用程序都需要與關系數據庫打交道。但由于關系數據庫與Java對象在結構上有著本質的區別,關于它們之間的映射關系對于那些Java開發者們來說,是一個很令人頭痛的問題。關系型數據庫是以表格方式存儲數據的,而Java對象是以樹型方式表現的。這種類型上的不匹配引發了各種各樣的對象持久化解決方案,用來縮小關系世界與對象世界之間的鴻溝。EJB框架正是這種解決方案之一。
對象的持久性
目前有很多不同的工具出現,使得開發人員可以將JAVA對象轉化為數據庫中的字段或記錄,或者將數據庫中的字段或記錄還原為JAVA對象。這些處理涉及到要將樹型的JAVA對象序列化到數據庫中,反之亦然。此工作的核心是怎樣在保證最小性能損失的前提下,來完成這項工作。
EJB框架提供了這樣一個對象持久化機制。我們將在本文中討論這種機制,但首先我們還是對EJB構架作一個全面的熟悉。
企業級JavaBeans(EJB)
EJB技術可以這樣定義:它是一個基于JAVA服務端的,為分布式應用提供的一個可復用的組件框架。所有的商業邏輯、部署定義、對象持久性都由這個框架統一治理,EJB框架的一些特色如下:
· EJB是一種運行在服務端環境下的JAVA對象。
· EJB能分布在不同的機器上進行遠程訪問,但對客戶端來而言,調用EJB與調用本地JavaBean一樣方便。
· EJB容器對EJB進行統一治理。
盡管企業級JavaBean的名字與普通JavaBean在命名上有些相像,但它們在設計上有著本質上的區別。為了能讓你更清楚地熟悉到這點,我們最好先了解一下EJB的基本概念、幾種EJB組件模式和其配置環境。
EJB的運行環境
從本質上來說,EJB只是實現了特定接口的普通JAVA對象,但這個對象必須運行在一個特定的環境:EJB容器中。假如脫離了EJB容器,EJB是無法運行的。EJB與EJB容器之間的關系有時候被稱為"反向調用"――或者叫"好萊塢原理"(別聯系我,到時候我會給你打電話的)。
EJB容器是一種用來治理EJB的運行時環境。它容納并治理不同類型的EJB,這與JAVA servlet容器治理servlet有些類似。EJB容器負責初始化EJB,并給其提供系統級的服務。
當客戶端程序要調用某一個EJB時并不直接與EJB打交道,客戶端與EJB被容器隔離起來。
EJB容器提供的服務
當開發者創建一系列的類與接口,用來組成一個EJB時,容器會為他們提供如下的系統級服務:
· 事務處理
· 安全治理
· EJB的持久化治理
· EJB的遠程訪問
· EJB的生命周期治理
· 數據庫連接池
· EJB的實例池治理
由于EJB容器負責為EJB提供這種底層服務,使得一個EJB開發者只需關注具體應用的商業邏輯,從而減少了很多不必要的麻煩。
EJB的類型
EJB規范定義了以下三種不同類型的EJB類型:
· 消息驅動EJB(MDB)
· 會話EJB
· 實體EJB
當客戶端與會話EJB或實體EJB交互時,它們的通信方式是同步通信。而消息驅動EJB(MDB)則只與JMS進行交互,它相當于JMS中的一個發布/訂閱主題。
消息驅動EJB
消息驅動EJB工作在異步通信模式下。一個消息驅動EJB充當一個消息偵聽者的角色,它偵服從JMS的發布/訂閱主題中傳來的消息。
EJB容器治理著消息驅動EJB的生命周期,然而與會話EJB和實體EJB不同之處在于客戶端并不能直接調用它的方法。消息驅動EJB是通過一個名為onMessage的回調函數來接收客戶端的消息的。
會話EJB
會話EJB的特點是不能同時被多個客戶端共享。當客戶端調用會話EJB的方法時,先經過EJB容器處理,然后再由容器對會話EJB進行調用。會話EJB處理開發者編寫商業邏輯,容器再將處理結果返回給客戶端。會話EJB不能在多個會話中持久保存。它分為兩種類型:有狀態的會話EJB和無狀態的會話EJB。
有狀態的會話EJB
當一個客戶端與某一個有狀態的會話EJB開啟一個會話時,這個EJB為客戶端維護了一個會話狀態。這暗示著客戶端向此EJB發出不同的調用請求之間保證EJB的成員變量值不會丟失。
一旦客戶端結束與有狀態的會話EJB的交互后,EJB容器會自動銷毀它。于是整個會話結束,并且此有狀態的會話EJB所保存的狀態數據會全部丟失。
無狀態會話EJB
無狀態會話EJB并不為客戶端保存任何狀態數據。你可以這樣認為:客戶端每次對無狀態會話EJB的調用都會產生一個新的EJB實例,因此所有的狀態信息都不會保存。 同樣,EJB容器也不會持久化任何無狀態會話EJB,因此開發者必須意識到客戶端與無狀態會話EJB之間進行交互時,所有的狀態數據都是臨時的。無狀態會話EJB的這種特性使得容器可以重復地使用它的實例,因此無狀態會話EJB能得到比有狀態會話EJB更好的性能。
實體EJB
實體EJB表達的的是一種持久存儲的商業邏輯,通常存儲于關系型數據庫中。實體EJB與關系型數據庫有如下的相似之處:
· 實體EJB是持久的――它可以在應用程序的生命周期之外存在,甚至可以在EJB容器的生命周期以外存在。
· 實體EJB答應共享訪問――多個客戶端可以共享同一個實體EJB,而容器負責治理它們之間的同步。
· 實體EJB有主鍵――主鍵用來確定實體EJB的一個唯一實例,利用它可以找到一個特定的持久化實體。
· 實體EJB有事務的概念――由于客戶端能并發訪問并修改它的數據,因此事務治理是非常重要的。事務治理屬性被顯示地定義在部署描述文件中,而容器負責治理事務的邊界。
要實現對象-關系映射,那實體EJB必須能提供插入、更新、查詢、刪除的操作。而用于治理實體EJB對象與數據源之間的映射的過程被稱為持久化。換句話說,持久化是一個將信息寫入外部數據源的一個過程。EJB規范定義了實體EJB的兩種持久化方式:Bean自身治理的持久化(BMP)和容器治理的持久化(CMP)。
新聞熱點
疑難解答