專利名稱:用于訪問(wèn)一個(gè)以上數(shù)據(jù)庫(kù)服務(wù)器的方法和裝置的制作方法
技術(shù)領(lǐng)域:
本發(fā)明涉及應(yīng)用,并且更具體地涉及容器管理持久性企業(yè)Java Bean(CMP EJB)。
背景技術(shù):
Java 2平臺(tái)企業(yè)版(J2EE)是一種用于開(kāi)發(fā)、部署和管理多層(n-tier)的、允許使用Web的、以服務(wù)器為中心并且基于組件的企業(yè)應(yīng)用的開(kāi)放的和基于標(biāo)準(zhǔn)的平臺(tái)。在這個(gè)環(huán)境內(nèi)有三種類型的企業(yè)Java Bean(EJB)實(shí)體Bean、會(huì)話Bean、和消息驅(qū)動(dòng)Bean。
特別感興趣的是用于實(shí)現(xiàn)復(fù)雜業(yè)務(wù)實(shí)體的實(shí)體Bean。實(shí)體Bean模擬業(yè)務(wù)實(shí)體或模擬業(yè)務(wù)處理中的多個(gè)活動(dòng)。實(shí)體Bean經(jīng)常用于使得涉及數(shù)據(jù)和所述數(shù)據(jù)的計(jì)算的業(yè)務(wù)服務(wù)易于進(jìn)行。例如,應(yīng)用開(kāi)發(fā)者可以實(shí)現(xiàn)實(shí)體Bean以便檢索購(gòu)買訂單內(nèi)的項(xiàng)目并執(zhí)行對(duì)所述項(xiàng)目的計(jì)算。實(shí)體Bean在執(zhí)行其必要的任務(wù)時(shí)能管理多個(gè)相關(guān)的持久性對(duì)象。
因此,實(shí)體Bean典型地被描述為遠(yuǎn)程對(duì)象,其管理持久性數(shù)據(jù),執(zhí)行復(fù)雜的業(yè)務(wù)邏輯,潛在地使用若干相關(guān)的Java對(duì)象,并可以由主鍵唯一地標(biāo)識(shí)。實(shí)體Bean通常被認(rèn)為是粗粒度的持久性對(duì)象,因?yàn)樗鼈兪褂么鎯?chǔ)在多個(gè)細(xì)粒度的持久性Java對(duì)象中的持久性數(shù)據(jù)。
實(shí)體Bean是持久性的,因?yàn)樗鼈兡軌蛐颐庥诜?wù)器崩潰或者網(wǎng)絡(luò)故障。當(dāng)實(shí)體Bean被重新實(shí)例化時(shí),自動(dòng)恢復(fù)先前實(shí)例的狀態(tài)。
每一個(gè)實(shí)體Bean都具有與其相關(guān)聯(lián)的持久性標(biāo)識(shí)。也就是說(shuō),實(shí)體Bean包含一個(gè)唯一標(biāo)識(shí),如果具有所述主鍵就可以對(duì)其進(jìn)行檢索--給定主鍵,客戶可以檢索該實(shí)體Bean。如果Bean不可用,容器實(shí)例化該Bean并重新填充持久性數(shù)據(jù)。
為當(dāng)Bean被鈍化(passivate)時(shí)保存狀態(tài)以及為當(dāng)發(fā)生故障時(shí)恢復(fù)狀態(tài)兩者提供用于實(shí)體Bean數(shù)據(jù)的持久化。因?yàn)閿?shù)據(jù)由容器以某種形式的數(shù)據(jù)存儲(chǔ)系統(tǒng)例如數(shù)據(jù)庫(kù)持久地存儲(chǔ),所以實(shí)體Bean能幸存下來(lái)。實(shí)體Bean使用下面兩種方法之一持久存儲(chǔ)業(yè)務(wù)數(shù)據(jù)a)使用容器管理持久性(CMP)實(shí)體Bean由容器自動(dòng)地持久存儲(chǔ),或b)通過(guò)實(shí)現(xiàn)在Bean管理持久性(BMP)實(shí)體Bean中的方法可編程地持久存儲(chǔ)。這些方法使用JDBC或者SQLJ來(lái)管理關(guān)系型數(shù)據(jù)庫(kù)中的持久性;或者使用任何API來(lái)管理非關(guān)系型存儲(chǔ)中的持久性數(shù)據(jù)。
當(dāng)確定如何管理EJB的持久性時(shí)有各種安排,這些安排中的一個(gè)涉及如何管理EJB對(duì)數(shù)據(jù)源的引用。例如,EJB可能從數(shù)據(jù)庫(kù)的各種表中檢索數(shù)據(jù)的不同字段。在EJB應(yīng)用的編碼中,所述代碼指定該數(shù)據(jù)庫(kù)或數(shù)據(jù)源的標(biāo)識(shí)。
BMP EJB可以通過(guò)在其內(nèi)部定義多個(gè)數(shù)據(jù)源并且然后在運(yùn)行時(shí)查詢這些數(shù)據(jù)源連接多個(gè)數(shù)據(jù)源。然而與之相反,在部署期間CMP EJB僅能在為其管理的持久性數(shù)據(jù)中指定一個(gè)數(shù)據(jù)源。因此,為了使CMP EJB連接多個(gè)不同的數(shù)據(jù)庫(kù),必須為每個(gè)不同數(shù)據(jù)庫(kù)部署CMP EJB并在給定的運(yùn)行時(shí)將CMP EJB綁定到一個(gè)數(shù)據(jù)源。CMP EJB的多個(gè)部署增加了應(yīng)用服務(wù)器環(huán)境的復(fù)雜性并不必要地使用了該環(huán)境中的資源。因此,在當(dāng)前的J2EE應(yīng)用中仍然需要一種使得一個(gè)CMP EJB部署可以訪問(wèn)多個(gè)數(shù)據(jù)源的方式。
發(fā)明內(nèi)容
本發(fā)明的實(shí)施例涉及J2EE框架,該框架包括對(duì)在一個(gè)部署中以一個(gè)CMP EJB訪問(wèn)多個(gè)數(shù)據(jù)源的支持。盡管在J2EE平臺(tái)內(nèi)明確描述了此處提供的特定例子和實(shí)施例,本領(lǐng)域普通技術(shù)人員能將會(huì)認(rèn)識(shí)到任何模擬或仿真J2EE平臺(tái)的至少一些特征的平臺(tái)都將支持本發(fā)明的實(shí)施例。
本發(fā)明的一方面涉及一種用于在執(zhí)行環(huán)境中訪問(wèn)一個(gè)以上的數(shù)據(jù)庫(kù)的方法,其中,每個(gè)數(shù)據(jù)庫(kù)與相應(yīng)的數(shù)據(jù)源例如由J2EE應(yīng)用使用的數(shù)據(jù)源相關(guān)聯(lián)以便定義用于相關(guān)聯(lián)的數(shù)據(jù)庫(kù)的連接信息。根據(jù)本發(fā)明的這個(gè)方面,從執(zhí)行中的容器管理持久性企業(yè)Java Bean(CMP EJB)接收請(qǐng)求以便訪問(wèn)所述一個(gè)以上的數(shù)據(jù)庫(kù)中的一個(gè)數(shù)據(jù)庫(kù),并且選擇所述各個(gè)數(shù)據(jù)源中的一個(gè)數(shù)據(jù)源。CMP EJB被動(dòng)態(tài)地連接到所述各個(gè)數(shù)據(jù)源中所選擇的一個(gè)數(shù)據(jù)源以便在運(yùn)行時(shí)期間給該請(qǐng)求提供服務(wù)。
本發(fā)明的另一方面涉及一種用于在J2EE應(yīng)用服務(wù)器平臺(tái)中訪問(wèn)一個(gè)以上數(shù)據(jù)庫(kù)的方法。根據(jù)該方面,一個(gè)以上數(shù)據(jù)源的每一個(gè)與相應(yīng)的資源引用相關(guān)聯(lián),并且識(shí)別容器管理持久性企業(yè)Java Bean(CMP EJB)的屬性和各個(gè)資源引用之間的映射。然后例如基于該映射信息,確定使用所述一個(gè)以上數(shù)據(jù)源中的哪一個(gè)數(shù)據(jù)源來(lái)給調(diào)用提供服務(wù)以便訪問(wèn)所述數(shù)據(jù)庫(kù)服務(wù)器中的一個(gè)數(shù)據(jù)庫(kù)服務(wù)器。
圖1是與本發(fā)明一致的結(jié)合有J2EE平臺(tái)的聯(lián)網(wǎng)的計(jì)算機(jī)系統(tǒng)的框圖;圖2是示出了與本發(fā)明的原理一致的J2EE平臺(tái)的主要組件的框圖;圖3示出了根據(jù)本發(fā)明的原理用于訪問(wèn)用于CMP EJB的數(shù)據(jù)源的示例方法的流程圖。
具體實(shí)施例方式
本發(fā)明的實(shí)施例涉及J2EE框架,該框架包括對(duì)在一個(gè)部署中以一個(gè)CMP EJB訪問(wèn)多個(gè)數(shù)據(jù)源的支持。下面將更詳細(xì)地描述能以與本發(fā)明一致的方式支持該功能的這樣一種框架的特定實(shí)現(xiàn)。然而,在討論這種特定的實(shí)現(xiàn)以前,將提供關(guān)于這種J2EE框架可以駐留在其中的示例硬件和軟件環(huán)境的簡(jiǎn)要討論。
現(xiàn)在轉(zhuǎn)到附圖,其中相同數(shù)字表示幾個(gè)附圖的相同部分,圖1示出根據(jù)本發(fā)明的原理適合于實(shí)現(xiàn)運(yùn)行時(shí)平臺(tái)諸如J2EE的裝置10的示例的硬件和軟件環(huán)境。出于本發(fā)明的目的,裝置10實(shí)際上可代表任何類型計(jì)算機(jī)、計(jì)算機(jī)系統(tǒng)或其它可編程電子設(shè)備,包括客戶計(jì)算機(jī)、服務(wù)器計(jì)算機(jī)、便攜式計(jì)算機(jī)、手持式計(jì)算機(jī)、嵌入式控制器等等。此外,可以使用(例如)群集或其它分布式計(jì)算系統(tǒng)內(nèi)的一個(gè)或多個(gè)聯(lián)網(wǎng)的計(jì)算機(jī)實(shí)現(xiàn)裝置10。雖然應(yīng)該理解術(shù)語(yǔ)“裝置”還可包括與本發(fā)明一致的其它適合的可編程電子設(shè)備,在下文中裝置10還將稱作為“計(jì)算機(jī)”。
計(jì)算機(jī)10典型地包括連接到存儲(chǔ)器14的至少一個(gè)處理器12。處理器12可以代表一個(gè)或多個(gè)處理器(例如微處理器),并且存儲(chǔ)器14可以代表隨機(jī)訪問(wèn)存儲(chǔ)器(RAM)設(shè)備,包括計(jì)算機(jī)10的主存儲(chǔ)器以及任何輔助級(jí)存儲(chǔ)器,例如高速緩存存儲(chǔ)器、非易失或備份存儲(chǔ)器(例如可編程的或快閃存儲(chǔ)器)、只讀存儲(chǔ)器等等。此外,存儲(chǔ)器14可被認(rèn)為包括物理上位于計(jì)算機(jī)10內(nèi)的任何其它位置的存儲(chǔ)器存儲(chǔ)設(shè)備,例如處理器12中的任何高速緩存存儲(chǔ)器,以及用作虛擬存儲(chǔ)器的任何存儲(chǔ)容量,例如存儲(chǔ)在大容量存儲(chǔ)設(shè)備16上或其它通過(guò)網(wǎng)絡(luò)18連接到計(jì)算機(jī)10的任何計(jì)算機(jī)上(例如,客戶計(jì)算機(jī)20)。
計(jì)算機(jī)10還典型地接收若干用于向外部傳遞信息的輸入和輸出。作為與用戶和操作者之間的接口,計(jì)算機(jī)10典型地包括一個(gè)或多個(gè)用戶輸入設(shè)備22(例如尤其是鍵盤、鼠標(biāo)、軌跡球、游戲桿、觸摸墊和/或麥克風(fēng))和顯示器24(例如尤其是CRT監(jiān)視器、LCD顯示屏和/或揚(yáng)聲器)。另外,可以通過(guò)在網(wǎng)絡(luò)18上與計(jì)算機(jī)10連接的其它計(jì)算機(jī)(例如計(jì)算機(jī)20)或通過(guò)專用的工作站接口等來(lái)接收用戶輸入。
作為附加的存儲(chǔ)設(shè)備,計(jì)算機(jī)10還可以包括尤其是一個(gè)或多個(gè)大容量存儲(chǔ)設(shè)備16,例如軟盤或其它可移動(dòng)盤驅(qū)動(dòng)器、硬盤驅(qū)動(dòng)器、直接訪問(wèn)存儲(chǔ)設(shè)備(DASD)、光盤驅(qū)動(dòng)器(例如CD驅(qū)動(dòng)器、DVD驅(qū)動(dòng)器等等)和/或磁帶驅(qū)動(dòng)器。此外,計(jì)算機(jī)10可以包括與一個(gè)或多個(gè)網(wǎng)絡(luò)18(例如尤其是LAN、WAN、無(wú)線網(wǎng)絡(luò)和/或因特網(wǎng))的之間的接口以便允許與其它連接到所述網(wǎng)絡(luò)的計(jì)算機(jī)進(jìn)行信息傳遞。應(yīng)該理解如本技術(shù)領(lǐng)域公知的,計(jì)算機(jī)10典型地包括處理器12和每一個(gè)組件14、16、18、22和24之間的適合的模擬和/或數(shù)字接口。
計(jì)算機(jī)10在操作系統(tǒng)30的控制下操作,并且執(zhí)行或依賴各種計(jì)算機(jī)軟件應(yīng)用、組件、程序、對(duì)象、模塊、數(shù)據(jù)結(jié)構(gòu)等等(例如尤其是數(shù)據(jù)管理系統(tǒng)32和數(shù)據(jù)庫(kù)34)。此外,各種應(yīng)用、組件、程序、對(duì)象、模塊等等也可在通過(guò)網(wǎng)絡(luò)18連接到計(jì)算機(jī)10的另一計(jì)算機(jī)(例如,在分布式或客戶-服務(wù)器計(jì)算環(huán)境內(nèi))中的一個(gè)或多個(gè)處理器上執(zhí)行,從而實(shí)現(xiàn)計(jì)算機(jī)程序功能所需的處理可以被分配到網(wǎng)絡(luò)上的多個(gè)計(jì)算機(jī)。
一般地,被執(zhí)行以便實(shí)現(xiàn)本發(fā)明的實(shí)施例的例程在此處被稱為“計(jì)算機(jī)程序代碼”或簡(jiǎn)稱為“程序代碼”,本發(fā)明的實(shí)施例或是被實(shí)現(xiàn)為操作系統(tǒng)的一部分或是特定的應(yīng)用、組件、程序、對(duì)象、模塊或指令序列或者甚至是其子集。程序代碼通常包括在不同時(shí)刻駐留在計(jì)算機(jī)的不同存儲(chǔ)器和存儲(chǔ)設(shè)備中的一個(gè)或多個(gè)指令,并且當(dāng)被計(jì)算機(jī)的一個(gè)或多個(gè)處理器讀取并執(zhí)行時(shí),使得該計(jì)算機(jī)執(zhí)行必要的步驟以便執(zhí)行包含本發(fā)明的各方面的步驟或組成部分。此外,盡管本發(fā)明具有功能齊全的計(jì)算機(jī)和計(jì)算機(jī)系統(tǒng)上下文,并且下面將在功能齊全的計(jì)算機(jī)和計(jì)算機(jī)系統(tǒng)的上下文中描述本發(fā)明,本技術(shù)領(lǐng)域的普通技術(shù)人員應(yīng)當(dāng)理解,能夠以各種形式的程序產(chǎn)品發(fā)布本發(fā)明的各種實(shí)施例,并且不論用于實(shí)際承載所述發(fā)布的計(jì)算機(jī)可讀信號(hào)承載介質(zhì)的特定類型是怎樣的,本發(fā)明都同等適用。計(jì)算機(jī)可讀信號(hào)承載介質(zhì)的例子包括但不限于可記錄類型的介質(zhì),例如尤其是,易失的和非易失的存儲(chǔ)器設(shè)備、軟盤和其它可移動(dòng)盤、硬盤驅(qū)動(dòng)器、磁帶、光盤(例如CD-ROM光盤、DVD光盤等等)以及傳輸類型介質(zhì),諸如數(shù)字和模擬通信鏈路。
此外,可以基于應(yīng)用標(biāo)識(shí)下面描述的各種程序代碼,在本發(fā)明的特定實(shí)施例中所述的代碼被實(shí)現(xiàn)在這些應(yīng)用內(nèi)。然而,應(yīng)該理解下面的任何具體的程序命名僅是為了方便起見(jiàn),并且因此本發(fā)明不應(yīng)被限制為僅僅使用以這種命名標(biāo)識(shí)和/或暗指的任何特定的應(yīng)用。此外,根據(jù)計(jì)算機(jī)程序可以被組織為例程、程序、方法、模塊、對(duì)象等的典型的無(wú)數(shù)的方式,以及程序功能可以被分配到存在于典型的計(jì)算機(jī)內(nèi)的各個(gè)軟件層(例如,操作系統(tǒng)、庫(kù)、API、應(yīng)用、小應(yīng)用程序等等)中的各種方法,應(yīng)當(dāng)理解本發(fā)明不限于這里描述的程序功能的特定組織和分配。
圖2示出了本發(fā)明實(shí)施例可以被實(shí)現(xiàn)在其中的示例的應(yīng)用服務(wù)器環(huán)境。該應(yīng)用服務(wù)器可以在諸如圖1中所述的計(jì)算機(jī)平臺(tái)上或任何類似系統(tǒng)上執(zhí)行。最寬地看,該環(huán)境中的用戶訪問(wèn)應(yīng)用服務(wù)器202上的應(yīng)用以便執(zhí)行某些業(yè)務(wù)功能??梢詧?zhí)行的業(yè)務(wù)功能的一個(gè)例子是產(chǎn)生在數(shù)據(jù)源212、214中的一個(gè)數(shù)據(jù)源上執(zhí)行的SQL語(yǔ)句。應(yīng)用服務(wù)器202、Java環(huán)境、JavaBean 204、206一起操作以便對(duì)用戶或客戶208“隱藏”程序設(shè)計(jì)的細(xì)節(jié)。因此,客戶可能想了解與前一年相比最近兩個(gè)月內(nèi)特定地理區(qū)域的總的銷售。這些業(yè)務(wù)功能被實(shí)現(xiàn)為運(yùn)行在應(yīng)用服務(wù)器202中的一個(gè)或多個(gè)EJB。關(guān)于命名,首先開(kāi)發(fā)和編寫(xiě)EJB,然后它被部署在應(yīng)用服務(wù)器環(huán)境中。當(dāng)在該應(yīng)用服務(wù)器環(huán)境中由一些其它對(duì)象引用或“調(diào)用”時(shí),則執(zhí)行或?qū)嵗疎JB。
在圖2的環(huán)境中,客戶208典型地不與諸如CMP EJB 204的實(shí)體Bean交互。典型地開(kāi)發(fā)和部署應(yīng)用程序的方法涉及會(huì)話EJB 206,其充當(dāng)實(shí)體Bean的外表或前端。通常,會(huì)話Bean206是一個(gè)瞬時(shí)對(duì)象,其被調(diào)用以完成由實(shí)體Bean CMP EJB 204提供的任務(wù)或服務(wù)中的一個(gè)任務(wù)或服務(wù)。根據(jù)該編程模型,應(yīng)用程序開(kāi)發(fā)者在與客戶208的通信會(huì)話或事務(wù)處理期間使用無(wú)狀態(tài)會(huì)話EJB,并且它是使用適當(dāng)?shù)慕涌谂c實(shí)體Bean204交互的會(huì)話EJB 206。同樣,該方案將用戶從由實(shí)體Bean提供的任務(wù)的程序細(xì)節(jié)中分離出來(lái)。
當(dāng)開(kāi)發(fā)會(huì)話EJB 206時(shí),開(kāi)發(fā)者將在會(huì)話EJB中定義資源引用。這些資源引用涉及會(huì)話EJB可以引用的不同資源。雖然可以存在定義在會(huì)話EJB中的許多資源引用,在這種情況下,感興趣的資源引用包括CMP EJB204可以使用的數(shù)據(jù)源。因此如果在操作期間,實(shí)體Bean(CMP EJB 204)可能需要訪問(wèn)不同數(shù)據(jù)源,在所述會(huì)話Bean中定義用于這些不同數(shù)據(jù)源中的每一個(gè)數(shù)據(jù)源的資源引用。資源引用由一系列XML語(yǔ)句定義,所述的XML語(yǔ)句標(biāo)識(shí)資源的特征(例如名稱、路徑、引用等等)。盡管開(kāi)發(fā)者可以手工地創(chuàng)建用于會(huì)話Bean和實(shí)體Bean的代碼,他或她通常使用產(chǎn)生J2EE環(huán)境中所需要的各種XML Bean描述符的開(kāi)發(fā)環(huán)境。
雖然不是理解本發(fā)明的關(guān)鍵,部署應(yīng)用服務(wù)器202的環(huán)境應(yīng)該能與將給CMP EJB 204的請(qǐng)求提供服務(wù)的數(shù)據(jù)庫(kù)或數(shù)據(jù)庫(kù)服務(wù)器通信。這樣,數(shù)據(jù)源212、214是到各個(gè)數(shù)據(jù)庫(kù)或數(shù)據(jù)庫(kù)服務(wù)器的抽象連接(在圖2沒(méi)有示出)。CMP EJB通過(guò)調(diào)用應(yīng)用服務(wù)器202提供的一些方法連接到數(shù)據(jù)源212、214中的一個(gè)來(lái)訪問(wèn)數(shù)據(jù)庫(kù)或數(shù)據(jù)庫(kù)服務(wù)器。如這里使用的,短語(yǔ)“連接到數(shù)據(jù)庫(kù)服務(wù)器”、“連接到數(shù)據(jù)庫(kù)”和“連接到數(shù)據(jù)源”是等同的并且僅僅指不同的抽象級(jí)別。
提供將CMP EJB的屬性映射到資源引用的映射210。CMP EJB的屬性包括多個(gè)變量,所述變量可以采用用于CMP EJB的每一個(gè)不同實(shí)例的不同的值。例如,為了說(shuō)明映射210的一個(gè)示例的實(shí)現(xiàn),出于示例的目的假設(shè)CMP EJB 204表示雇員,并且定義于用于該Bean的描述符中的一個(gè)屬性是“雇員號(hào)”。例如如果雇員的雇員號(hào)固有地包括雇員位置的信息,而且運(yùn)行在Linux上的西海岸DB2服務(wù)器(具有資源引用“JDBC_11”)可以保存有位于密西西比河以西的所有雇員的雇員信息,而紐約的Informix數(shù)據(jù)庫(kù)服務(wù)器(具有資源引用“JDBC_2”)可以存儲(chǔ)著該河以東的雇員的雇員信息。假定具有號(hào)碼A001-A499的雇員在西海岸服務(wù)器上,而具有號(hào)碼A500-A999的雇員在東海岸的服務(wù)器上,則”雇員號(hào)”屬性可用于識(shí)別兩個(gè)不同數(shù)據(jù)源中的將訪問(wèn)的一個(gè)。一個(gè)示例的查詢可以查詢雇員號(hào)A302的雇用開(kāi)始時(shí)間。在這種示例查詢中,雇員號(hào)(A302)將表明應(yīng)當(dāng)訪問(wèn)西海岸服務(wù)器(JDBC_1)。
映射210可被實(shí)現(xiàn)為XML文件、數(shù)據(jù)庫(kù)表、屬性文件,或甚至使用程序邏輯以及其它可能的替換方案實(shí)現(xiàn)而不脫離本發(fā)明的范圍。不管其形式如何,該映射在a)CMP EJB屬性和b)會(huì)話EJB中的資源引用之間提供映射。如果希望,可以為若干不同的屬性包括相應(yīng)的映射210。此外,映射210可組合多個(gè)屬性,例如以布爾的方式,以便識(shí)別將使用的資源引用。
因此在上面的示例中,映射210將實(shí)現(xiàn)下述邏輯
如果雇員號(hào)是在A001和A499之間,則使用資源引用JDBC_1;否則如果雇員號(hào)在A500和A999之間,則使用資源引用JDBC_2。
本領(lǐng)域的普通技術(shù)人員將認(rèn)識(shí)到可以使用各種不同屬性、屬性值和屬性組合中的任意一種在不同的資源引用中進(jìn)行選擇而不脫離本發(fā)明的范圍。
圖3示出了根據(jù)本發(fā)明的原理用于從CMP EJB訪問(wèn)不同的數(shù)據(jù)源的示例算法的流程圖。在步驟302中,應(yīng)用程序開(kāi)發(fā)者為可由CMP EJB訪問(wèn)的每個(gè)不同數(shù)據(jù)庫(kù)服務(wù)器創(chuàng)建資源引用。這些資源引用在會(huì)話EJB中創(chuàng)建,并將典型地通過(guò)使用開(kāi)發(fā)界面被自動(dòng)地創(chuàng)建以簡(jiǎn)化其創(chuàng)建。
如前所述,在步驟304中,應(yīng)用服務(wù)器的部署環(huán)境將包括相應(yīng)于可由CMP EJB訪問(wèn)的每一個(gè)數(shù)據(jù)庫(kù)服務(wù)器的各個(gè)數(shù)據(jù)源。這些數(shù)據(jù)源被保持在應(yīng)用服務(wù)器的管理域內(nèi)。在J2EE環(huán)境中,數(shù)據(jù)源是實(shí)現(xiàn)標(biāo)準(zhǔn)邏輯以便與數(shù)據(jù)庫(kù)服務(wù)器實(shí)際連接的抽象連接。
應(yīng)用程序開(kāi)發(fā)者或一些其它管理員還將在步驟306提供映射,該映射提供CMP EJB的一個(gè)或多個(gè)屬性和所述資源引用之間的映射信息。更特別地,CMP EJB的屬性可以具有某些值,并且所述映射基于該屬性的值定義使用哪個(gè)資源引用。
根據(jù)本發(fā)明的原理,應(yīng)用服務(wù)器包括在運(yùn)行時(shí)期間利用由開(kāi)發(fā)者提供的映射的映射功能。該映射由會(huì)話Bean初始化。在初始化期間,在該會(huì)話Bean中定義的資源引用將被解析為相應(yīng)數(shù)據(jù)源的全局JNDI名稱。具體地,在步驟310當(dāng)會(huì)話EJB調(diào)用CMP EJB的方法時(shí),應(yīng)用服務(wù)器調(diào)用“getConnection()”方法并且應(yīng)用服務(wù)器認(rèn)識(shí)到將需要數(shù)據(jù)源標(biāo)識(shí)。映射機(jī)制將利用關(guān)于CMP EJB中的屬性和會(huì)話EJB中的資源引用的信息確定使用哪一個(gè)數(shù)據(jù)源得到連接。
因此,在步驟312將在適當(dāng)?shù)臄?shù)據(jù)源上執(zhí)行最終的底層的SQL語(yǔ)句以便從數(shù)據(jù)源檢索信息。以這種方式,CMP EJB可用來(lái)動(dòng)態(tài)地訪問(wèn)至少兩個(gè)不同數(shù)據(jù)源而不需要部署不同CMP EJB。
根據(jù)本發(fā)明的原理,在使用CMP EJB訪問(wèn)數(shù)據(jù)源時(shí),J2EE的應(yīng)用服務(wù)器不是僅僅訪問(wèn)數(shù)據(jù)源,而是檢查映射信息以便確定訪問(wèn)多個(gè)數(shù)據(jù)源的哪一個(gè)。如上面所述,所述映射信息有利地可以在CMP EJB的屬性和用于調(diào)用該CMP EJB的會(huì)話EJB內(nèi)的資源引用之間進(jìn)行映射。應(yīng)當(dāng)理解,上述功能在J2EE環(huán)境中的實(shí)現(xiàn)在受益于本公開(kāi)的本領(lǐng)域的普通技術(shù)人員的能力范圍內(nèi)。
可以做出與本發(fā)明一致各種修改。例如,在上述的實(shí)施例中,在會(huì)話Bean中定義資源引用并且初始化所述映射。然而,在其它實(shí)施例中,可在其它Java工件中定義資源引用。例如,可以在CMP EJB中定義資源引用和/或在CMP EJB中初始化映射,從而將使用CMP EJB的名字空間。在其它實(shí)施例中,可能希望使用滿足下列標(biāo)準(zhǔn)的Java工件(artfact)1)應(yīng)當(dāng)能定義資源引用,從而裝配者或部署者可以確定使用管理空間中的哪個(gè)數(shù)據(jù)源;以及2)應(yīng)當(dāng)在該Java工件中初始化該映射以便使用該Java工件的名字空間,從而資源引用能被正確解析。
在不脫離本發(fā)明的精神和范圍的情況下,可對(duì)示例的實(shí)施例做出各種另外的修改。因此,本發(fā)明落在下面所附的權(quán)利要求內(nèi)。
權(quán)利要求
1.一種用于在J2EE應(yīng)用服務(wù)器平臺(tái)中訪問(wèn)一個(gè)以上數(shù)據(jù)庫(kù)的方法,包括如下步驟將一個(gè)以上數(shù)據(jù)源中的每一個(gè)數(shù)據(jù)源與相應(yīng)的資源引用關(guān)聯(lián);識(shí)別容器管理持久性企業(yè)Java Bean(CMP EJB)的屬性和所述各個(gè)資源引用之間的映射;和確定使用所述一個(gè)以上數(shù)據(jù)源中的哪一個(gè)數(shù)據(jù)源給所述CMP EJB的調(diào)用提供服務(wù)以便訪問(wèn)所述數(shù)據(jù)庫(kù)服務(wù)器中的一個(gè)數(shù)據(jù)庫(kù)服務(wù)器。
2.如權(quán)利要求1所述的方法,還包括如下步驟在與所述CMP EJB具有接口的會(huì)話EJB中定義所述各個(gè)資源引用。
3.如權(quán)利要求1所述的方法,還包括如下步驟在與所述CMP EJB具有接口的Java工件中定義所述各個(gè)資源引用。
4.如權(quán)利要求1所述的方法,其中在所述應(yīng)用服務(wù)器平臺(tái)中存儲(chǔ)映射,所述映射提供了所述CMP EJB的屬性與所述各個(gè)資源引用之間的所述映射。
5.如權(quán)利要求4所述的方法,其中所述映射根據(jù)所述屬性的值定義使用所述各個(gè)資源引用中的哪一個(gè)。
6.如權(quán)利要求1所述的方法,還包括如下步驟確定所述屬性的值;基于所述值評(píng)估所述映射以識(shí)別使用所述一個(gè)或多個(gè)數(shù)據(jù)源中的哪一個(gè)數(shù)據(jù)源。
7.一種用于在執(zhí)行環(huán)境中訪問(wèn)一個(gè)以上數(shù)據(jù)庫(kù)的方法,其中每一個(gè)數(shù)據(jù)庫(kù)與相應(yīng)的數(shù)據(jù)源相關(guān)聯(lián),所述方法包括如下步驟從執(zhí)行中的容器管理持久性企業(yè)Java Bean(CMP EJB)接收請(qǐng)求以便訪問(wèn)所述一個(gè)以上數(shù)據(jù)庫(kù)中的一個(gè)數(shù)據(jù)庫(kù);從所述各個(gè)數(shù)據(jù)源中選擇一個(gè)數(shù)據(jù)源,并且將所述CMP EJB連接到所述各個(gè)數(shù)據(jù)源中所述被選擇的一個(gè)數(shù)據(jù)源。
8.如權(quán)利要求7所述的方法,其中選擇步驟還包括步驟評(píng)估所述CMP EJB的屬性以便識(shí)別所述一個(gè)數(shù)據(jù)源。
9.如權(quán)利要求7所述的方法,還包括步驟將所述各個(gè)數(shù)據(jù)源中的每一個(gè)數(shù)據(jù)源與相應(yīng)的資源引用相關(guān)聯(lián)。
10.如權(quán)利要求9所述的方法,還包括步驟在與所述CMP EJB具有接口的會(huì)話EJB中定義所述各個(gè)資源引用。
11.如權(quán)利要求10所述的方法,其中在所述執(zhí)行環(huán)境中存儲(chǔ)映射,所述映射提供了所述CMP EJB的屬性和所述各個(gè)資源引用之間的所述映射。
12.如權(quán)利要求11所述的方法,其中所述映射根據(jù)所述屬性的值定義使用所述各個(gè)資源引用的哪一個(gè)。
13.如權(quán)利要求7所述的方法,其中所述執(zhí)行環(huán)境是J2EE平臺(tái)。
14.一種裝置,包括容器管理持久性企業(yè)Java Bean(CMP EJB);被配置為與所述CMP EJB具有接口的會(huì)話EJB;被配置為實(shí)例化所述會(huì)話EJB、所述CMP EJB和二個(gè)或更多數(shù)據(jù)源的應(yīng)用服務(wù)器;和映射模塊,其將來(lái)自所述CMP EJB的數(shù)據(jù)請(qǐng)求映射為將被所述兩個(gè)或更多數(shù)據(jù)源中的一個(gè)數(shù)據(jù)源服務(wù)。
15.如權(quán)利要求14所述的裝置,其中所述映射模塊在所述應(yīng)用服務(wù)器內(nèi)執(zhí)行。
16.如權(quán)利要求14所述的裝置,其中所述CMP EJB包括可變的屬性;并且所述會(huì)話EJB包括用于所述兩個(gè)或更多數(shù)據(jù)源中的每一個(gè)數(shù)據(jù)源的相應(yīng)的資源引用。
17.如權(quán)利要求16所述的裝置,還包括映射,其基于所述屬性的值指示選擇所述各個(gè)資源引用中哪一個(gè),其中所述映射模塊參考所述映射以便將來(lái)自所述CMP EJB的數(shù)據(jù)請(qǐng)求映射為將被所述兩個(gè)或更多數(shù)據(jù)源中的一個(gè)數(shù)據(jù)源服務(wù)。
18.如權(quán)利要求14所述的裝置,其中所述應(yīng)用服務(wù)器在J2EE環(huán)境中運(yùn)行。
19.一種用于在J2EE應(yīng)用服務(wù)器平臺(tái)內(nèi)訪問(wèn)一個(gè)以上數(shù)據(jù)庫(kù)服務(wù)器的裝置,該裝置包括至少一個(gè)處理器;與所述至少一個(gè)處理器連接的存儲(chǔ)器;和駐留在所述存儲(chǔ)器內(nèi)并由所述至少一個(gè)處理器執(zhí)行的程序代碼,所述程序代碼被配置為將一個(gè)以上的數(shù)據(jù)源中的每一個(gè)數(shù)據(jù)源與相應(yīng)的資源引用相關(guān)聯(lián);識(shí)別容器管理持久性企業(yè)Java Bean(CMP EJB)的屬性和所述各個(gè)資源引用之間的映射;和確定使用所述一個(gè)以上數(shù)據(jù)源中的哪一個(gè)數(shù)據(jù)源給CMP EJB的調(diào)用提供服務(wù)以便訪問(wèn)所述數(shù)據(jù)庫(kù)中的一個(gè)數(shù)據(jù)庫(kù)。
20.如權(quán)利要求19所述的裝置,其中所述程序代碼還被配置為在與所述CMP EJB具有接口的會(huì)話EJB中定義所述各個(gè)資源引用。
21.如權(quán)利要求20所述的裝置,其中在所述應(yīng)用服務(wù)器平臺(tái)中存儲(chǔ)映射,所述映射提供了所述CMP EJB的屬性和各個(gè)資源引用之間的所述映射。
22.如權(quán)利要求21所述的裝置,其中所述映射根據(jù)所述屬性的值定義使用所述各個(gè)資源引用中的哪一個(gè)。
23.一種用于在J2EE應(yīng)用服務(wù)器平臺(tái)內(nèi)訪問(wèn)一個(gè)以上數(shù)據(jù)庫(kù)服務(wù)器的程序產(chǎn)品,包括程序代碼,被配置為在執(zhí)行后將一個(gè)以上數(shù)據(jù)源中的每一個(gè)數(shù)據(jù)源與相應(yīng)的資源引用相關(guān)聯(lián);識(shí)別容器管理持久性企業(yè)Java Bean(CMP EJB)的屬性和所述各個(gè)資源引用之間的映射;和確定使用所述一個(gè)以上數(shù)據(jù)源的哪一個(gè)數(shù)據(jù)源給所述CMP EJB的調(diào)用提供服務(wù)以便訪問(wèn)所述數(shù)據(jù)庫(kù)中的一個(gè)數(shù)據(jù)庫(kù);承載所述程序代碼的計(jì)算機(jī)可讀信號(hào)承載介質(zhì)。
全文摘要
一種容器管理持久性(CMP)企業(yè)Java Bean(EJB)框架包括對(duì)在一個(gè)部署內(nèi)訪問(wèn)多個(gè)數(shù)據(jù)源的支持。CMP EJB包括若干不同的屬性,所述不同的屬性可以是各種值。充當(dāng)所述CMP EJB的前端的會(huì)話EJB包括用于所述實(shí)體CMP EJB可以使用的每個(gè)不同的數(shù)據(jù)源的資源引用。該應(yīng)用服務(wù)器環(huán)境包括定義所述CMP EJB的屬性和所述會(huì)話EJB的資源引用之間的映射信息的映射。在運(yùn)行時(shí)期間使用該映射信息,該應(yīng)用服務(wù)器連接到適合的數(shù)據(jù)源。
文檔編號(hào)G06F17/30GK1797402SQ20051012837
公開(kāi)日2006年7月5日 申請(qǐng)日期2005年11月14日 優(yōu)先權(quán)日2004年12月29日
發(fā)明者P·J·戴克斯, T·C·甘, W·T·紐波特, 湯劍 申請(qǐng)人:國(guó)際商業(yè)機(jī)器公司