|
級別: 中級
Stanley Bradbury (bradbury@us.ibm.com), 社區(qū)協(xié)調(diào)人 - Cloudscape, IBM
2005 年 11 月 24 日 2005 年 11 月 24 日 更新
IBM® Cloudscape™ 是免費提供的 Apache Derby 關(guān)系數(shù)據(jù)庫管理器的改裝產(chǎn)品。J2EE™ 服務(wù)器是基于 Sun 的 Java Enterprise Edition(J2EE)規(guī)范的中間件軟件,它將很多 Java Service 技術(shù)捆綁在一個集成的系統(tǒng)中。大多數(shù) J2EE 應(yīng)用程序要求有一個與 J2EE 服務(wù)器集成的遵從 JDBC 規(guī)范的數(shù)據(jù)庫,以便存儲信息。本文展示如何最恰當?shù)貙?Cloudscape 或 Derby 應(yīng)用到 J2EE 環(huán)境中。
簡介
應(yīng)用程序服務(wù)器(也稱 app server)作為一種為不同位置、使用不同類型計算機的用戶提供信息和服務(wù)的方法,正得到越來越多人的青睞。通常,應(yīng)用程序服務(wù)器位于數(shù)據(jù)庫或其他信息存儲(即后端)與終端用戶/客戶(即客戶機)的中間,從而形成一種“三層架構(gòu)”。本文討論如何在一個使用基于 Sun Java Enterprise Edition(J2EE)規(guī)范的應(yīng)用程序服務(wù)器系統(tǒng)中,建立作為該系統(tǒng)后端的 IBM Cloudscape 或 Derby 數(shù)據(jù)庫。在這里描述的配置中,數(shù)據(jù)庫管理系統(tǒng)(DBMS)也可能被稱作 Resource Manager。
 |
本文中 IBM Cloudscape 或 Derby 的稱謂 IBM Cloudscape 數(shù)據(jù)庫引擎 就是 Apache Derby 數(shù)據(jù)庫引擎。IBM Cloudscape 是在來自 Apache 的未經(jīng)修改的代碼行基礎(chǔ)上構(gòu)建的。關(guān)于這一點容易產(chǎn)生混淆,所以原來在本文中,每當提到這種數(shù)據(jù)庫引擎時,我都會同時給出這兩種產(chǎn)品名稱。但是,正如一個評審者所說的:“一次又一次地讀到 ‘Cloudscape 或 Derby’ 這個短語會讓人覺得乏味。”為解決這個問題,并讓本文讀起來更順暢,除了對 IBM Cloudscape 的特別討論外,其他地方我都采用慣用的簡稱“Derby”。 |
|
如今,大多數(shù)應(yīng)用程序服務(wù)器都基于 J2EE 規(guī)范,但也有一些屬于其他類型。基于 J2EE 的系統(tǒng)的流行起因于它們的非專有性。它們很快為開放源碼和開放架構(gòu)社區(qū)所采納。這些通用服務(wù)器繼承了 Java “隨處運行”的能力。由于 IBM Cloudscape 引擎(即 Apache Derby 引擎)也是以 Java 實現(xiàn)的,因而可以干凈利落地進行集成,并且能不作修改地在任何有 J2EE 服務(wù)器的地方運行。
如果您有應(yīng)用程序服務(wù)器方面的經(jīng)驗,那么可以跳過接下來的段落。否則,還是應(yīng)該閱讀一下這個段落,因為它簡要地給出了應(yīng)用程序服務(wù)器系統(tǒng)的概念,這有助于理解本文的后續(xù)部分。為了理解這個主題,您可以把 J2EE 應(yīng)用程序服務(wù)器想象成“運行”一個或多個基于 Java 的應(yīng)用程序的中間軟件。它組合(捆綁)了支持應(yīng)用程序和允許連接到網(wǎng)絡(luò)的用戶安全地使用應(yīng)用程序所需的不同技術(shù)。應(yīng)用程序服務(wù)器管理中間層組件,這些組件負責執(zhí)行大部分重頭任務(wù)。而客戶層通常是使用 Web 瀏覽器與中間層“交談”的人。而在中間層的后面,受中間層保護的是一個業(yè)務(wù)系統(tǒng),即后端,最近也被稱作 Enterprise Information System (EIS)層。在應(yīng)用程序服務(wù)器中運行的應(yīng)用程序可以使用很多種應(yīng)用程序編程接口(API)來編寫,最常見的有 Java(J2SE)例程、Java Server Page(JSP)和 Servlet。無論使用何種 API,應(yīng)用程序都可以訪問為應(yīng)用程序服務(wù)器環(huán)境定義的數(shù)據(jù)庫。圖 1 展示了一個描繪這三層和一些組件的簡化視圖。本文主要關(guān)注中間層和 EIS 層。
圖 1. 三層架構(gòu)
Derby 的不同之處
大多數(shù) J2EE 應(yīng)用程序都需要存儲數(shù)據(jù),管理數(shù)據(jù)的最常見的方法是使用遵從 JDBC 規(guī)范的數(shù)據(jù)庫。任何帶 JDBC 驅(qū)動程序接口的數(shù)據(jù)庫都可以與 J2EE 應(yīng)用程序服務(wù)器集成,以創(chuàng)建 J2EE 術(shù)語中所謂的“Resource Manager”(RM)。Derby 引擎非常適合 Resource Manager 的角色。它被設(shè)計成在較大型系統(tǒng)中使用的關(guān)系數(shù)據(jù)庫組件,這正是常用于描述 Derby 的術(shù)語“嵌入式數(shù)據(jù)庫”所指的意思。當在一個 J2EE 服務(wù)器中實現(xiàn)(嵌入)時,它將成為該服務(wù)器中實現(xiàn)(部署)的應(yīng)用程序可以利用的專用工具。
J2EE 服務(wù)器為網(wǎng)絡(luò)通信和安全性提供支持,它們可以根據(jù)系統(tǒng)需求進行配置。Derby 引擎不提供這些功能,但是樂于利用服務(wù)器環(huán)境中的這些服務(wù)。很多數(shù)據(jù)庫系統(tǒng)二進制文件中的很大一部分代碼都是支持 J2EE 系統(tǒng)中已經(jīng)存在的系統(tǒng)安全和網(wǎng)絡(luò)通信功能。Derby 占用的內(nèi)存很少,因為它的庫沒有包含這些代碼。當 Derby 被嵌入到一個 J2EE 服務(wù)器中時,只需使整個服務(wù)器系統(tǒng)所占的內(nèi)存增加 2 MB,就可以創(chuàng)建一個功能完備的遵從 JDBC 的 Resource Manager 。
Derby 與 J2EE
下面的列表列出了使用 Derby 的一些關(guān)鍵優(yōu)點。要了解完整信息,請參閱本文 參考資料 小節(jié)中引用的“Tech Overview”。
- Derby 是一種功能完備的關(guān)系數(shù)據(jù)庫,具有能與大型企業(yè)數(shù)據(jù)庫相抗衡的能力。不要讓它極小的規(guī)模(2 MB)和成本(0 美元)給騙了。
- Derby 是純事務(wù)型的,當和 J2EE 服務(wù)器的 JTA 事務(wù)管理器一起使用時,可以參與全局(分布式)事務(wù)。
- Derby 數(shù)據(jù)庫系統(tǒng)(二進制文件和數(shù)據(jù)庫)可以復制到任何帶有 J2SE JVM 的平臺,并且無需重新編譯或作其他修改就能運行。
- 缺省配置下的 Derby 數(shù)據(jù)庫系統(tǒng)不需要進行單獨的管理。它的引擎在 J2EE 服務(wù)器 JVM 進程中運行,成為系統(tǒng)集成的一部分。
在設(shè)計使用數(shù)據(jù)庫的應(yīng)用程序時,首先做出的決定之一是如何訪問數(shù)據(jù)。J2SE 提供以下兩種方法來訪問帶有 JDBC 兼容驅(qū)動程序的關(guān)系數(shù)據(jù)庫:
- 使用 JDBC 服務(wù)提供程序接口(SPI)。這意味著應(yīng)用程序使用 JDBC DataSource 接口來建立到數(shù)據(jù)庫的連接。對于 J2EE 應(yīng)用程序,這是可取的訪問方法,原因有以下幾點:
- 它允許程序代碼完全獨立于數(shù)據(jù)庫。驅(qū)動程序信息、數(shù)據(jù)庫的位置和配置參數(shù)都是由 J2EE 服務(wù)器存儲的。
- 它允許使用連接共享(即連接池)。J2EE 服務(wù)器連接管理器有效地管理連接,從而大大地提高性能和可伸縮性。
- 它允許 Enterprise JavaBeans(EJB)使用數(shù)據(jù)庫來實現(xiàn) J2EE 服務(wù)器中的業(yè)務(wù)邏輯。雖然沒有要求實現(xiàn) EJB 層,但這樣做可以為建立高度可伸縮的分布式應(yīng)用程序架構(gòu)提供基礎(chǔ)。
- 直接來自應(yīng)用程序代碼。這意味著應(yīng)用程序使用 JDBC DriverManager 類來建立數(shù)據(jù)庫連接。獨立(不基于服務(wù)器)的數(shù)據(jù)庫應(yīng)用程序正是以這種方式來編寫的。這種應(yīng)用程序是自包含的,不依賴于來自應(yīng)用程序服務(wù)器的信息或服務(wù)。這種應(yīng)用程序也不會從應(yīng)用程序服務(wù)器 JDBC Service Provider 提供的可移植性和可伸縮性中受益。
使用 J2EE 應(yīng)用程序服務(wù)器的主要優(yōu)點在于它簡化了對用于數(shù)據(jù)庫訪問的 JDBC SPI 的使用。大多數(shù)業(yè)務(wù)程序員都不愿意,為了使用 JDBC SPI 而編寫他們自己的數(shù)據(jù)源和連接池代碼,并實現(xiàn)一個命名的服務(wù)器。實際上,更高效的方法是建立一個應(yīng)用程序服務(wù)器環(huán)境。
將 Derby 用作 Resource Manager
本節(jié)展示如何使用 JDBC 服務(wù)提供程序接口(SPI)將 Derby 設(shè)置為 J2EE Resource Manager 。除了前面列出的諸多優(yōu)點以外,使用 JDBC SPI 來支持 Derby 嵌入式驅(qū)動程序還可以避免由應(yīng)用程序服務(wù)器引擎內(nèi)實現(xiàn)的安全性和隔離措施導致的潛在問題(請參閱 應(yīng)用程序服務(wù)器中的 Resource Manager 小節(jié),以獲得更多信息)。將一個數(shù)據(jù)庫定義為受管資源的一般步驟是:
- 準備數(shù)據(jù)庫:
- 安裝 RDBMS。對于 Derby 來說,這意味著將 derby.jar 添加到應(yīng)用程序服務(wù)器目錄樹中。
- 在必要時啟動 RDBMS。對于 Derby 來說,當應(yīng)用程序服務(wù)器裝載 JDBC 驅(qū)動程序時,引擎將自動啟動。
- 創(chuàng)建應(yīng)用程序數(shù)據(jù)庫。這通常是通過由數(shù)據(jù)庫的命令行處理工具(例如 IJ)處理的一個 SQL 命令文件來完成的。
- 定義和部署應(yīng)用程序用來訪問數(shù)據(jù)庫的數(shù)據(jù)源。此時,大多數(shù) J2EE 服務(wù)器將自動做以下工作:
- 注冊對象名稱到一個名稱服務(wù)器中。在應(yīng)用程序中,這個名稱用于替代任何特定于數(shù)據(jù)庫的信息,以建立到數(shù)據(jù)庫的連接。
- 設(shè)置一個連接池。這個池對應(yīng)用程序是完全透明的,可以提高性能和可伸縮性。
- 啟動數(shù)據(jù)源/連接器,或者配置應(yīng)用程序服務(wù)器,使之自動啟動。
- 使用用于連接的 JDBC DataSource 接口編寫應(yīng)用程序(或者使用容器管理的持久性,但那是另一個話題)。
在“定義和部署數(shù)據(jù)源”這一步中,需要提供特定于 RDBMS 和數(shù)據(jù)庫的信息,以便建立連接。完成這一步所需的基本信息有:
- JDBC 驅(qū)動程序庫的位置和名稱(例如:derby.jar)。
- JDBC 驅(qū)動程序類名(例如:org.apache.derby.jdbc.EmbeddedDriver)
- 數(shù)據(jù)庫連接 URL (例如:jdbc:derby:Databases/JPetstoreDB)
- 參數(shù)代碼(多數(shù)情況下是可選的)
捕捉數(shù)據(jù)源信息和部署數(shù)據(jù)源的過程會隨著 J2EE 服務(wù)器的不同而不同。很多系統(tǒng)有一個控制臺應(yīng)用程序來幫助定義和部署數(shù)據(jù)源。下一節(jié)展示了如何使用 Gluecode Standard Edition Console 來設(shè)置數(shù)據(jù)源。在后面的 參考資料 小節(jié)中,通過相應(yīng)的鏈接可以找到關(guān)于將 Derby 設(shè)置為 IBM WebSphere® 和 Apache Geronimo 中的 Resource Manager 的手冊說明。
使用 Gluecode Standard Edition 設(shè)置 Derby Resource Manager
Gluecode Standard Edition 是一種集成了很多開放源碼技術(shù)的應(yīng)用程序服務(wù)器。它簡化了 J2EE 環(huán)境中 Java 應(yīng)用程序的部署和管理。Gluecode 捆綁了 Apache Geronimo J2EE 服務(wù)器,并提供了一個 GUI 管理控制臺,用于連接 Resource Manager 和部署應(yīng)用程序(要了解關(guān)于獲得和使用 Gluecode 的信息,請訪問 參考資料 小節(jié)中的 Gluecode 鏈接)。下面的步驟概括了為一個名為 JPetstoreDB 的 Derby 數(shù)據(jù)庫創(chuàng)建數(shù)據(jù)源的過程。對于這個例子,必須將該數(shù)據(jù)庫復制到 Gluecode 子目錄 ...var/derby/Databases 中。該實現(xiàn)使用與 Gluecode 捆綁的 Apache Derby(可以在 ...repository/incubator-derby/jars 中找到)。
- 啟動 Gluecode 并訪問管理控制臺(URL:http://localhost:8080/console/login.html)。
- 在開始的 Information 屏幕中,單擊左側(cè)導航列表中的 Databases 鏈接(圖 2)。
圖 2. Gluecode 導航列表
- 在 Database Connections 窗口中,單擊列表框底部的 Add New Datasource 鏈接。
- 為新數(shù)據(jù)源填入信息,如圖 3 所示。單擊 Create。
圖 3. Gluecode 數(shù)據(jù)源定義屏幕
這就夠了?,F(xiàn)在,部署在服務(wù)器上的應(yīng)用程序便可以通過引用 JNDI 名稱來訪問這個數(shù)據(jù)庫,而不必管實際使用的是哪種 DBMS。
服務(wù)器中的 Resource Manager
當按照以上描述完成配置之后,Derby 數(shù)據(jù)庫使應(yīng)用程序服務(wù)器層與 EIS 層之間的差別模糊化。與大多數(shù)其他 RDBMS 不同,它是在應(yīng)用程序服務(wù)器 JVM 中運行的 Java 程序(嵌入式的),而不是在它自己的地址空間內(nèi)單獨運行的進程。
 |
部署多個使用 Derby 的應(yīng)用程序
按照 Derby 的設(shè)計,數(shù)據(jù)庫引擎(derby.jar)可以很容易地與應(yīng)用程序包捆綁在一起,成為隨應(yīng)用程序安裝的 jar 文件。這使得獨立應(yīng)用程序環(huán)境中的安裝可以一步到位,而不會導致任何問題。然而,如前所述,在應(yīng)用程序服務(wù)器環(huán)境中,由于數(shù)據(jù)庫引擎是嵌入在其中的,當使用多個版本的 Derby 時,可能引發(fā)問題。使用嵌入式 Derby 的一項重要原則是 “決不將來自多個 derby.jar 副本的類裝載到同一個 JVM 中”。
為了避免在需要部署多個提供 derby.jar 的應(yīng)用程序時出現(xiàn)問題,可以使用 sysinfo 命令(org.apache.derby.tools.sysinfo)來判斷哪個是更新版本的 Derby,并使用那個 jarfile。軟升級(soft upgrade)特性可以使老版本 Derby 創(chuàng)建的數(shù)據(jù)庫與新版本兼容。不要在服務(wù)器系統(tǒng)中同時存在多個 derby.jar。
|
|
由于這個原因,它容易受到應(yīng)用程序服務(wù)器內(nèi)部實現(xiàn)細節(jié)的影響,尤其容易受多個類裝載器的實現(xiàn)的影響。為了同時運行多個應(yīng)用程序,并使這些應(yīng)用程序不致于相互干擾,應(yīng)用程序服務(wù)器使用多個類裝載器來提供必要的隔離。如果 Derby 系統(tǒng)的類是由用于支持單個應(yīng)用程序?qū)嵗恢С炙袘?yīng)用程序?qū)嵗念愌b載器裝載的,那么它就會碰到問題。數(shù)據(jù)庫引擎類甚至可能跨多個類裝載器。這將導致數(shù)據(jù)庫引擎中止。由于數(shù)據(jù)庫是共享資源,因此應(yīng)該在比類裝載器更高的層次上裝載它。
類裝載器和類裝載器層次結(jié)構(gòu)是一個復雜的話題,其中有更多的細節(jié)不是本文所能論述的(要了解關(guān)于此話題的更多信息,請訪問后面 參考資料 小節(jié)中的“J2EE Class Loading Demystified”鏈接)。然而,需要注意的是,對類裝載器的使用會隨著應(yīng)用程序服務(wù)器的不同而不同,因此,即使一個直接裝載 Derby 驅(qū)動程序的應(yīng)用程序在某個服務(wù)器上可以運行得很好,但當部署到另一個應(yīng)用程序服務(wù)器上時,可能無法運行。而通過服務(wù)提供程序接口建立數(shù)據(jù)庫連接,無論應(yīng)用程序服務(wù)器如何管理類裝載器層次結(jié)構(gòu),都可以保證應(yīng)用程序在不同應(yīng)用程序服務(wù)器環(huán)境之間是可移植的。
如果應(yīng)用程序架構(gòu)使您不能使用服務(wù)提供程序接口,或者需要將數(shù)據(jù)庫處理負載分布到另一臺機器上,那么可以結(jié)合 Network Server 來使用 Derby。Derby Network Server 在一個與 J2EE 服務(wù)器分離的進程中運行 Derby。Network Server 給系統(tǒng)引入了一些復雜性,因為它需要單獨啟動,單獨實現(xiàn)驗證和一組安全策略(這些事情通常由 J2EE 服務(wù)器來處理)。當使用 Derby Network Server 時,還要求使用這里沒有提到的不同的 JAR 文件和數(shù)據(jù)庫連接 URL 語法。嵌入在 Derby Network Server 中的 Derby 引擎在一個標準的客戶機-服務(wù)器架構(gòu)中運行,這和大多數(shù)其他數(shù)據(jù)庫系統(tǒng)是一樣的。
結(jié)束語
現(xiàn)在有很多 J2EE 應(yīng)用程序服務(wù)器,它們各自捆綁了“自己”的一組 Java 技術(shù)產(chǎn)品和服務(wù)。要想了解有哪些可用的應(yīng)用程序服務(wù)器,可以訪問后面“參考資料”小節(jié)中的“Application Server Matrix”鏈接。每種服務(wù)器都為使用相互配合的不同技術(shù)提供了簡化的接口。大多數(shù)應(yīng)用程序服務(wù)器都支持本文描述的數(shù)據(jù)源和連接池的創(chuàng)建。
大多數(shù) J2EE 應(yīng)用程序服務(wù)器中具有的另一個重要特性是,至少通過 Servlet 和 Java Server Page(JSP)提供對服務(wù)器端處理的支持。J2EE 服務(wù)器中可能出現(xiàn)的其他服務(wù)和技術(shù)有 EJB、連接器、JMS、JTA 等。當出現(xiàn)新的技術(shù)和標準時,它們也將被并入到這些應(yīng)用程序服務(wù)器中。由于這種技術(shù)的范圍是如此之廣,發(fā)展是如此之快,所以很多人第一次面臨 J2EE 時變得不知所措也就毫不奇怪了。和所有復雜的系統(tǒng)一樣,最好的選擇是逐步熟悉 J2EE。本文提供的信息是對 J2EE 架構(gòu)較基本的一種介紹。
參考資料
學習
獲得產(chǎn)品和技術(shù)
討論
關(guān)于作者
 |
|
|
 |
Stanley Bradbury 目前在 IBM 的 Cloudscape 小組擔任社區(qū)協(xié)調(diào)人的工作。在此之前,他為 Cloudscape 提供三級支持(2001 年到 2005 年)。在與 Cloudscape 打交道之前,他先后管理過生物技術(shù)、制造業(yè)和互聯(lián)網(wǎng)安全服務(wù)業(yè)的數(shù)據(jù)庫。他畢業(yè)于加州大學 Berkeley 分校,喜歡和家人呆在一起。
|
|