將存儲過程封裝為EJB組件的方法
|
集成 Web 應用服務器和數據庫管理 (DBMS) 技術是很多新型商業應用的常見需求。在本文中,我們將討論該集成的一個方面:如何在會話 Enterprise JavaBeans (EJB) 組件中設計與開發封裝或調用現有 DBMS 存儲過程的方法。您應該熟悉 EJB 技術、結構化查詢語言 (SQL) 和 Java 數據庫連接 (JDBC) 的基本知識,以便充分理解本文。
如果您正致力于需要訪問或修改在 DMBS 中數據的 Web 應用程序開發,那么可能已經在向基于 EJB 的設計轉移。您可能會發現,通過使會話 EJB 組件利用 DBMS 存儲過程,可以減少編碼和維護工作,并可能提高數據訪問性能。
一些公司多年來一直在使用存儲過程(stored procedure),很大程度上是因為它們可以幫助減少網絡通信量,并提高分布式計算環境中的性能。通常,這些過程包含涉及多數據庫操作的重要業務邏輯。遠程應用程序調用這些過程,在 DMBS 服務器上執行它們所包含的 SQL 語句。當然,過程結束時,所有結果都返回給應用程序。
這些舊有存儲過程對 Web 應用通常是有用的。與其在 EJB 組件中復制這些邏輯,為什么不將這些過程作為方法封裝在會話 bean 中呢?這樣可以避免 DBMS 服務器和 EJB 組件中的冗余代碼 -- 在考慮開發、調試和維護開銷時,冗余代碼將損耗開發效率。這還可能帶來提高性能的好處。調用存儲過程可以減少 EJB 組件原本不得不發出的 SQL 語句數量,從而減少與遠程 DBMS 的通信開銷。
入門
現在明白為什么要從會話 bean 調用存儲過程了吧,下面我們看看如何開始。首先,需要使用適當的開發環境,該環境應該包括一個帶有內置 EJB 支持的 Java 開發工具,一個 Web 應用服務器和一個關系 DBMS。我的參考配置包括 VisualAge for Java 企業版 3.0.2,WebSphere Application Server 高級版 3.0.2.1,以及 DB2 V7.1,所有這些都安裝在一個 Windows NT 系統上。有關如何配置該環境以支持本文所述工作的詳細信息,請參閱 "Leveraging DBMS Stored Procedures through Enterprise JavaBeans"(位于參考資料中)或參考產品手冊。
有了正確的軟件環境,就可以開始了。雖然我們要討論的編碼模式可能適合于無狀態會話(stateless session) bean,但它也可使用有狀態會話(stateful session) bean 組件。但是,因為無狀態會話 bean 比有狀態會話 bean 消耗的系統資源更少,而且涉及的代碼也更少,所以通常建議使用無狀態會話 bean。
首先要考慮的設計問題是如何在存儲過程和 EJB 組件之間映射數據。存儲過程可能需要多個輸入、輸出和輸入/輸出參數,并返回一個或多個結果集(代表數據行)。除非要對不同類型的過程使用不同的編碼模式,您需要編寫 EJB 組件以便處理所有這些可能性。
處理輸入(或者輸入/輸出)參數很簡單:將存儲過程需要的每個參數映射成 EJB 組件的輸入參數。但是,處理存儲過程的輸出比較棘手。可能有多個輸出參數和多個結果集要傳回調用程序,需要將這些作為一個可序列化的對象返回,以符合 EJB 規范。可以編寫自己的類,使其可以將這些數據打包成一個對象,并在該對象中包括所有必須的元數據。(該元數據將描述對象的內部結構,以便客戶機知道如何處理。)但這需要大量工作。
如果正在使用 VisualAge for Java 和 WebSphere,那么,有個更好的選項:使用它們的數據訪問 Bean (DAB) 庫。該庫包含一些提供位于基本 JDBC 之上的函數層的類。可能會發現 com.ibm.db.CallableStatement 類特別方便,因為它允許創建一個可序列化的對象,該對象包含所有從存儲過程返回的輸出,包括多個結果集(如果有的話)和相關元數據。還有一個好處是,該庫設計成可以支持任何支持 JDBC 的數據源,因此,它可以使 bean“與 DBMS 無關”。有了 DAB 庫,就可以用一個編碼模式在會話 EJB 組件中封裝任何存儲過程。甚至可以在 EJB 客戶機中使用一個通用的編碼模式,來處理任何從封裝器方法返回的結果。