【IT168 技術文章】
對於開發新軟體系統來說,面向對象編程無疑是當今使用最為廣泛的編程模式。由於商業數據的持久性需求,關係資料庫管理系統(RDBMS)取得了最為 廣泛的應用。RDBMS 使用的是關係模型,它與軟體系統中的域對象模型有所不同。使用面向對象程式語言開發軟體系統並使用 RDBMS 來持久存儲數據時,數據持久化框架將成為應用程式架構中非常關鍵和重要的組件,它們的作用是隱藏應用程式數據持久化的底層複雜性。
在過去的幾年中,一些持久化框架得到了很好的發展,它們可幫助您管理對象關係映射和數據持久性需求。但是,根據需要選擇一個合適的框架並不是一件簡 單的任務,因為多種因素會影響到這個決定。在本文中,我將根據三個基本標準來討論如何一些應用比較廣泛的 Java 持久化框架中做出選擇:選擇、時機和優缺點。在「選擇」這部分中,我將介紹如何選擇框架;在「時機」這部分中,我將討論一些您應該考慮應用框架的應用場景 以及一些您應該尋找備選方案的應用場景;最後,在「優缺點」這一部分中,我將討論當您決定採用某個框架時,該框架所有的優勢和缺點。首先要討論的是下面這 個在 Java 持久化領域中最著名的框架。
Entity Enterprise Java Bean
Java Persistence API
Hibernate
TopLink
讓我們更加詳細地討論這些框架。
Entity Enterprise Java Bean
Enterprise JavaBean(EJB)技術是針對 Java 平臺 Enterprise Edition (Java EE) 的一種託管的伺服器端組件架構。在此定義中,「託管」和「伺服器端」是關鍵術語。在 EJB 架構中,應用伺服器 將管理一個或多個已部署的 EJB 的生命周期,並通過 EJB 容器提供公共運行時服務。容器提供的服務包括安全性、並發控制、事務和持久化管理等。
EJB 規範 定義了三種 Enterprise Bean 類型:Session、Entity 和 Message Driven。每種類型都具有一些獨特特性,分別用於不同目的。由於本文是關於 Java 持久化框架的,我們將簡單討論一下 EJB 架構的持久化方面,討論中會涉及使用 Entity EJB 管理您的 Enterprise Java 應用程式的持久化要求。
使用 EJB 設計應用程式時,EJB 表示業務域模型中的一個實體。例如,試想一個商業銀行應用程式的 Account 實體。該 Account Entity Bean 將被部署到 J2EE 應用程式伺服器中,該伺服器將通過 EJB 容器給此 Entity Bean 提供一些運行時間服務。這種服務是自動持久化的,我將更加詳細地討論。
根據持久化實現的方式,Entity EJB 可以進一步劃分為兩種:Bean-Managed Persistence(BMP)和 Container-Managed Persistence(CMP)。使用 BMP,Bean 實例通過 JDBC 代碼負責其狀態的持久化。而使用 Container-Managed Persistence,EJB 容器提供自動管理 Entity Bean 的持久化的能力:當需要時,將狀態保存到底層資料庫或從底層資料庫加載狀態。
現在讓我們討論一些應用場景,在這些應用場景中您一般可能想要應用 EJB 框架,特別情況下可能使用 CMP 進行數據持久化。
何時考慮將EJB作為持久化框架
首先您要考慮的是需要容器提供的服務。如果您的應用程式需要除持久化管理以外的其他容器提供的服務,比如轉換管理、安全性和並發控制,則最好使用 EJB 框架。
另外還要考慮資源要求。EJB 框架可為需求應用程式提供完美的可伸縮性。但是,這也是有代價的:密集的資源要求,尤其使用 遠程接口 模式時。只在沒有資源限制的時候考慮應用 Entity EJB,以便獲得所需的性能水平。
還有一個相關的因素是 de facto 框架。如果您正在進行某個基於 Java 平臺的 EE 部署,則機會在於 EJB 容器已成為您的應用程式伺服器的一部分。「為什麼不用已經可用的?」可能是在你的架構決策制定過程中首先要問的問題。我把這看作是相對其他框架的一個「政治」優勢,因為它已經可用了。
何時考慮將EJB的備選方案作為持久化框架
持久層的功能要求可能是提示您需求備選方案的第一個因素。如果您的應用程式不需要 EJB 框架提供的每個功能,則這表示您應該尋求一個備選方案。
資 源可用性超過了性能要求可能是另一個您想要尋求其他備選方案的情況。儘管 EJB 框架提供了完美的性能和可伸縮性,但是 EJB 框架的對資源的消耗也是非常驚人的。底線問題是:我們真的需要這個嗎? 在很多情況下,寫得很好的數據訪問對象或 Hibernate 框架就可提供完美的備選方案。
儘管很少,但數據源(而不是關係資料庫)可能阻止您使用容器管理的持久化框架。
如果您已經使用或計劃使用 EJB 作為您的持久化框架,這裡是一些您可以預期的優勢和缺點。
Entity EJB有什麼優勢?
該基於組件的分布式模型使其獨立於網絡 - EJB 組件可以部署到為其他應用程式提供服務的同一 JVM 上,或者位於不同地理位置的應用程式伺服器的 JVM 上。
您將獲得完美的可伸縮性:EJB 可以很好地向上擴展,因為容器可以匯聚實例,必要時可以進行激活和鈍化。
EJB 經過長時間的檢驗,已成為成熟的技術。而且,它經過發展,還可以提供更多有用的服務和功能。例如,計時器服務就是我最喜歡的服務之一;使用它,您可以計劃 作業按指定的間隔執行(比如每晚、每周或每月)。在 EJB 3.0 中還有一項有用的功能「Java 語言元數據注釋支持」,該功能消除了實體持久化所需的所有接口以及在 EJB 的查詢語言中的增強。
Entity EJB有什麼缺點?
學習和使用 EJB 架構是不簡單的。您應該準備學習一些術語,比如 remote interface(遠程接口)、home interface(Home 接口), activation(激活)、passivation(鈍化) 等等,其中大部分僅適用於 EJB 世界。
EJB 架構不提供持久化獨立。由於這些類在 EJB 容器中以其自己的方式使用,因此沒有在其他框架中使用 EJB 類的簡便方法。
對於 Entity Bean,要想獲得可接受的性能水平一直是一個挑戰,尤其是在遠程接口模式中。