專利名稱:用于在jvm中支持多租戶隔離/多租戶定制的系統(tǒng)和方法
技術領域:
本發(fā)明涉及計算機領域,更具體地,本發(fā)明涉及用于在JVM中 支持多租戶隔離和/或多租戶定制的系統(tǒng)和方法。
背景技術:
SaaS ( Software-as-a-Service:軟件即服務)服務通常基于單個應 用程序?qū)嵗秊槌砂偕锨У牟煌蛻?又稱租戶,其中每個租戶又有 很多用戶)提供服務。這就要求系統(tǒng)能夠支持不同租戶之間數(shù)據(jù)的 隔離,從而保證每個租戶的數(shù)據(jù)的安全與隱私,以及各個租戶對諸 如界面、業(yè)務邏輯等的個性化需求。
例如,在用JAVA語言編寫的web應用程序中通常通過一個靜-態(tài)變量來記錄在一個時間周期期間的站點訪問量。在多租戶環(huán)境中, 在每個租戶希望看到其自己的用戶對于站點的訪問量的情況下,如
果仍然使用傳統(tǒng)的靜態(tài)變量或單態(tài)模式來記錄在一個時間周期期間 的站點訪問量,將會出現(xiàn)沖突。
考慮下面的代碼,即在支持多租戶的一個web應用程序中,采 用靜態(tài)變量counter來記錄在一個時間周期期間的站點訪問量 Class SiteCounter {
public static int counter = 0; 〃一些其他邏輯
租戶1的用戶Bob訪問該站點將使靜態(tài)變量counter的值變成1。 租戶2的用戶Ted查看站點訪問量將得到靜態(tài)變量counter的值, 現(xiàn)在的值是2,包括Ted他自己的對站點的訪問次數(shù)。然而,實際上,對于租戶2來說,只有l(wèi)次站點訪問。也就是說,在這種情況下, 不同租戶之間的數(shù)據(jù)沒有被隔離。
再考慮如下的代碼,即在支持多租戶的一個web應用程序中, 使用單態(tài)模式來記錄在一個時間周期期間的站點訪問量(在 http:〃en.wikipedia.org/wiki/Singleton—pattern 中有關于單態(tài)才莫式的介 紹)
Class SiteCounter{
private int counter=0;
private static SiteCounter _instance=null;
private SiteCounterO {
public static synchronized SiteCounter getlnstance() { if (—instance = = null)
—instance = new SiteCounter(); return —instance;
public void addCounter()( counter++;
public int getCounter()( return counter;
租戶 1 的用 戶 Bob 訪問 站點將調(diào)用 SiteCounter.getInstance.addCounter(),因》匕變量counter的j直J見在變?yōu)?1 。 租戶 2 的用戶 Ted 查看站點訪問量將調(diào)用 SiteCounter.getlnstance.getCounter(), 變量counter J見在具有4直2, 包 括Ted自己的對站點的訪問次數(shù)。然而,實際上,對于租戶2來說, 只有1次站點訪問。也就是說,在這種情況下,不同租戶之間的數(shù)據(jù)也沒有被隔離。
當前,對于上述問題的一種解決方案是為每個租戶安裝專用應用 拷貝,然而這種方案的性能和可擴展性差,很難支持大量的租戶。
另一種解決方案是在應用層采用隔離和定制機制,例如,在應用
程序中對需要隔離的變量使用集合對象(Collection Object)(例如 Map)來為每個租戶分配一個特定值,來紀錄每個租戶的變量的值; 對需要定制的類,使用工廠模式和配置文件來動態(tài)加載租戶特定的 類實現(xiàn)。這種方案要求開發(fā)人員注意多租戶實現(xiàn)的細節(jié),因此極大 地增加了應用程序開發(fā)人員的負擔。對于租戶的特定定制要求,如 果在開發(fā)時沒有考慮到,可能需要修改并且重新安裝應用程序,具 有擴展性問題。
發(fā)明內(nèi)容
根據(jù)本發(fā)明的一個方面,提出了一種用于在JAVA虛擬機JVM 中支持多租戶隔離和/或多租戶定制的系統(tǒng),包括確定器,用于確 定應用程序的哪些類需要進行隔離和/或哪些類需要被定制;樁產(chǎn)生 器,用于為隔離類和/或定制類產(chǎn)生樁;租戶公用類加載器,用于加 載所述樁和其他不需要進行隔離的類和沒有被定制的類;租戶特定 類加載器,用于加栽隔離類和/或定制類;字節(jié)碼轉(zhuǎn)換器,用于轉(zhuǎn)換 引用被隔離類和/或被定制類的類的字節(jié)碼,使其變成引用隔離類和/ 或定制類的樁;其中在需要時,通過租戶公用類加載器創(chuàng)建所述樁 的實例和不需要進行隔離的類和沒有被定制的類的實例,以及通過 租戶特定類加載器創(chuàng)建隔離類和/或定制類的實例;其中通過所述樁 和/或所述樁的實例,可以實現(xiàn)與由租戶特定類加載器加載的類和/ 或其實例通信。
根據(jù)本發(fā)明的另一個方面,提出了一種用于在JAVA虛擬機JVM 中支持多租戶隔離和/或多租戶定制的方法,包括步驟確定應用程 序的哪些類需要進行隔離和/或哪些類需要被定制;為隔離類和/或定 制類產(chǎn)生樁;由租戶公用類加載器加載所述樁和不需要進行隔離的類和沒有被定制的類,以及由租戶特定類加載器加載隔離類和/或定
制類;轉(zhuǎn)換引用被隔離類和/或被定制類的類的字節(jié)碼,使其變成引 用隔離類和/或定制類的樁;其中,在需要時,通過租戶公用類加載 器創(chuàng)建所述樁的實例和其他不需要進行隔離的類和沒有被定制的類 的實例,以及通過租戶特定類加載器創(chuàng)建隔離類和/或定制類的實例; 其中通過所述樁和/或所述樁的實例,可以實現(xiàn)與由租戶特定類加載 器加載的類和/或其實例通信。
根據(jù)本發(fā)明,能夠解決不同租戶之間數(shù)據(jù)的隔離,以及滿足各個 租戶對界面、業(yè)務邏輯等的個性化需求,同時克服現(xiàn)有技術方案的 一些缺點。
通過以下結合附圖的說明,并且隨著對本發(fā)明的更全面了解,本 發(fā)明的其他目的和效果將變得更加清楚和易于理解,其中
圖1示出了本發(fā)明可以在其中實現(xiàn)的系統(tǒng)100;
圖2示出了根據(jù)本發(fā)明的一個實施方式的用于在JAVA虛擬機 JVM中支持多租戶隔離和/或多租戶定制的系統(tǒng)200的框圖3示意性地示出了各個類的引用關系以及當一些類需要進行 隔離和 一 些類被定制時,相應的類的實例之間的通信關系;
圖4示出了通過樁和樁的實例,可以實現(xiàn)與租戶特定類加載器加 載的類和其實例通信的例子;
圖5示意性地示出了類加載器層次結構中的每一層中的租戶公 用類加載器,都具有相應的租戶特定類加載器的情況;
中支持多租戶隔離和/或多租戶定制的方法的流程圖。
在所有的上述附圖中,相同的標號表示具有相同、相似或相應的 特;f正或功能。
具體實施例方式
8圖1示出了本發(fā)明可以在其中實現(xiàn)的系統(tǒng)100。如圖1所示,該 系統(tǒng)100包括一個服務器110、兩個客戶端120和130、以及一個網(wǎng) 絡140。服務器110、客戶端120和130可以是膝上型計算機、小型 機、或中型機等等。并且,服務器UO經(jīng)由鏈路112連接到網(wǎng)絡140; 客戶端120和130分別經(jīng)由鏈路122和132連接到網(wǎng)絡140。鏈路 112、 122和132可以是有線鏈路,諸如同軸電纜、光纖等,也可以 是無線鏈路,諸如衛(wèi)星鏈路等。同樣地,網(wǎng)絡140可以是無線網(wǎng)、 有線網(wǎng)或它們的組合。另外,網(wǎng)絡140可以是局域網(wǎng)、城域網(wǎng)、廣 域網(wǎng)或它們的組合。例如,網(wǎng)絡140是因特網(wǎng)。
當然,本領域的4支術人員應該理解,在網(wǎng)絡140上還可以連接有 其他的客戶端。并且,為了能夠彼此識別,客戶端和服務器可以具 有可以唯 一 地識別它們的標識,例如IP地址、統(tǒng) 一 資源定位符(URL )等。
在這里,假設租戶1的各個用戶使用客戶端120通過鏈路122、 網(wǎng)絡140、鏈路112來訪問提供SaaS服務的服務器110,而租戶2 的各個用戶使用客戶端130通過鏈路132、網(wǎng)絡140、鏈路112來訪 問提供SaaS服務的服務器110。
在服務器110中,安裝有用于向各個租戶提供服務的應用程序, 并且,該應用程序是用JAVA語言編寫的,通過JAVA虛擬機JVM, 來執(zhí)行該應用程序。在服務器110中,具有根據(jù)本發(fā)明的用于在 JAVA虛擬機JVM中支持多租戶隔離和/或多租戶定制的系統(tǒng)。
圖2示出了根據(jù)本發(fā)明的一個實施方式的用于在JAVA虛擬機 JVM中支持多租戶隔離和/或多租戶定制的系統(tǒng)200的框圖。
如圖2所示,該系統(tǒng)200包括確定器220,用于確定應用程序的 哪些類需要進行隔離和/或哪些類需要被定制。
然后,樁(stub)產(chǎn)生器230 (也叫作代表類產(chǎn)生器),為那些隔 離類和/或定制類產(chǎn)生樁(代表類)。
樁是一個媒介,其攜帶了對被調(diào)用的真實對象的引用,可以實現(xiàn) 從調(diào)用者到被調(diào)用者的訪問。對每個隔離類和/或定制類,樁產(chǎn)生器230會按著相應的規(guī)則生 成對應的樁。下文將用具體例子對樁作出進一步的說明。
然后,由對于所有租戶公用的類加載器(本文中也稱作"租戶公 用類加載器")240加載所述樁和其他不需要進行隔離的類和沒有被 定制的類,由租戶特定類加載器250加載隔離類和/或定制類。這里, 為了簡單起見,只示出了一個租戶特定類加載器。實際上,對于每 個租戶,都可以有其特定的類加載器。
然后,字節(jié)碼轉(zhuǎn)換器260轉(zhuǎn)換引用被隔離類和/或被定制類的類 的字節(jié)碼,使其變成引用隔離類和/或定制類的樁。
在被隔離類包括靜態(tài)變量的情況下,所述字節(jié)碼轉(zhuǎn)換器260將引 用靜態(tài)變量的類的字節(jié)碼中的getstatic或putstatic指令轉(zhuǎn)換成 invokestatic指令,該invokestatic指令調(diào)用所述樁中的靜態(tài)方法來操 作靜態(tài)變量。
此外,在需要時,例如在實際執(zhí)行時,通過租戶公用類加載器 240創(chuàng)建所述樁的實例和其他不需要進行隔離的類和沒有被定制的 類的實例,以及通過租戶特定類加載器250創(chuàng)建隔離類和/或定制類
的實例。
其中通過所述樁和/或所述樁的實例,可以實現(xiàn)與由租戶特定類 加載器加載的類和/或其實例通信。
其中,租戶公用類加載器可以包括應用類加載器。租戶特定類加 載器可以例如是一個在MT Enhance JVM中預定義的類,就像在普 通JVM里面的JDK中的類一樣。當需要時,它會被加載起來進行相 應的操作。
其中,可以在應用程序被開發(fā)人員編寫好之后,來確定該應用 程序中的哪些類由于具有靜態(tài)變量或是單態(tài)模式的等原因,需要在 各個租戶之間隔離。
在本發(fā)明的一個實施方式中,系統(tǒng)200還包括租戶身份識別器 210,用于識別當前登錄的請求者的租戶身份。
一旦請求者登陸系統(tǒng),租戶身份識別器210確定當前請求者的租戶身份。更具體地說,可以通過讓請求者登陸系統(tǒng)時,其需要輸入
其租戶名,或者通過請求者的URL等,辨別租戶的身份。因此,租 戶身份識別器210可以確定當前請求者的租戶身份。
并且,在該實施方式中,確定器220根據(jù)租戶身份,確定應用程 序的那些類需要被定制。
例如,租戶可以在注冊到系統(tǒng)中時提出定制要求,系統(tǒng)可以將定 制要求和租戶身份相結合地存儲在其中。這樣,確定器220就可以 根據(jù)租戶身份,確定應用程序的那些類需要被定制。
圖3示意性地示出了各個類的引用關系以及當一些類需要在各 個租戶之間進行隔離和一些類凈皮租戶定制時,相應的類的實例之間 的通信關系(在這里,為了簡單起見,假定只有兩個租戶,租戶1 和租戶2)。
如圖3中左邊所示,類301引用類302和類303,而類303引用 類304。其中,類302具有靜態(tài)變量,例如前面所描述的靜態(tài)變量 counter,因此,類302需要在各個租戶之間進行隔離(當然,類302 還可以包括靜態(tài)方法、方法等等)。因此,對于租戶1和租戶2來 說,需要的是類302,,其與類302有稍微的不同,如下文所述。此 外,對于租戶1來說,由于定制的原因,其需要的是類304,,而不 是類304;然而,租戶2不需要定制,其需要的仍然是類304。
如圖3中右邊所示,根據(jù)本發(fā)明,使用了 3個類加載器對于所 有的租戶公用的類加載器一例如應用類加載器310、租戶1特定類加 載器320和租戶2特定類加載器330。
其中,應用類加載器310加載類301、類303、類304的定義(如 實線方框所示),并且,應用類加載器310還加載類302,的樁302" 的定義和類304,的樁304"的定義(如虛線方框所示)。
租戶1特定類加載器320加載類302,和類304,的定義(如實線 方框所示);租戶2特定類加載器330加載類302,的定義(如實線 方框所示)。
在需要時,例如在實際執(zhí)行時,通過應用類加載器310創(chuàng)建類n301的實例3011、樁302"的實例302,,1、類303的實例3031、樁 304,'的實例304,,1、類301的實例3012、樁302,,的實例302"2、類 303的實例3032、類304的實例3042;通過租戶1特定類加載器320 創(chuàng)建類302,的實例302,1、類304,的實例304,1;通過租戶2特定類 加載器330創(chuàng)建類302'的實例302,2。
在圖3中,實線圓圈表示類實例,而虛線圓圏表示樁實例。
在圖3所示的情況下,實例3011借助于實例302, ,1實現(xiàn)與實例 302,1通信,實例3031借助于實例304, ,1實現(xiàn)與實例304,1通信; 而實例3012借助于實例302, ,2實現(xiàn)與實例302,2通信。換句話i兌, 樁302,,的實例302, ,1和302, ,2、以及樁304,,的實例304, ,1起中 間橋梁作用,使得由于通過不同的類加栽器創(chuàng)建,從而在它們之間 不能通信的類實例3011和302,1之間、類實例3031和304,1之間、 以及類實例3012和302,2之間可以通信。
圖4示出了通過樁和樁的實例,可以實現(xiàn)與租戶特定類加載器加 載的類和其實例通信的例子。
類A引用類B,而類B由于具有靜態(tài)變量counter,而需要在各 個租戶之間隔離。另外,類B還包括方法ml()和m2()。
在圖4所示的例子中,應用類加載器410加載類A(如實線方框 所示)。相應地,租戶特定類加載器420加載類B,(如實線方框所 示)。此外,應用類加載器410還加載相應的樁B,,(如虛線方框所 示)。
另外,通過應用類加載器410創(chuàng)建類A的實例a(如實線圓圈所 示)、樁B,,的實例b,,(如虛線圓圏所示)。
相應地,通過租戶特定類加載器420創(chuàng)建類B,的實例b,(如實 線圓圈所示)。
如圖4所示,實例a的調(diào)用類B的靜態(tài)變量counter的請求^皮轉(zhuǎn) 才灸成調(diào)用4莊B,,的l爭態(tài)方法 invokecounter(), 由該靜態(tài)方法 invokecounter()從位于租戶特定類加載器420中的類B ,中取回該靜態(tài) 變量counter的值。實例a的調(diào)用類B的實例b的方法ml()和m2()的請求被轉(zhuǎn)發(fā)到樁B"的實例b,,,通過其的相應方法ml()和m2()訪
問類B,的實例b,的方法mlO和m20。
以下結合示例性代碼來描述本發(fā)明中采用的一些概念。 如下的代碼示意性地示出了一個具有靜態(tài)變量,因此需要在各個
租戶之間隔離的類定義 Class E
〃Public Attribute Variables
'nmns, 3gc, clazzC 〃 Static Variable
'counter 〃Method
ml() 〃Static Method
sl()
該類E包括公共屬性變量(實例變量)name, age, clazzC;靜 態(tài)變量counter;方法ml()和靜態(tài)方法sl()。
其中,對于靜態(tài)變量,不需要有類的實例就可以調(diào)用,而對于
實例變量,需要有類的實例才可以調(diào)用。方法和靜態(tài)方法的區(qū)別是
對于靜態(tài)方法,不需要有類的實例就可以調(diào)用;對于方法,需要有 類的實例才可以調(diào)用。
這個類E定義是由應用程序的開發(fā)人員初始編寫的,可以通過 已知的技術分析出這個類E具有靜態(tài)變量,因此需要在各個租戶之
間隔離。
例如,該類E是圖3中的類302。
如下的代碼示意性地示出了因此生成的,將由各個租戶特定類 加載器加載的類定義 Class E' extends PE 〃Public Attribute Variables
name, age, clazzC〃 Static Variable
'counter 〃Method
ml() 〃Static Method
sl()
可以看出,該類E,定義與上面所述的由應用程序開發(fā)人員初始 所編碼的類E定義幾乎相同,區(qū)別在于這個類E,繼承于父類PE(以 下有該類PE定義的描述)。
如下的代碼示意性地示出了父類PE的定義,其將由應用類加 載器力口載
AbstractClass PE 〃抽象父類的定義 〃Public Attribute Variables
name, age, clazzC 〃Method
ml() 〃Static Method
sl()
與應用程序的開發(fā)人員初始編寫的類E定義相比,在該父類PE 定義中,沒有靜態(tài)變量。
如下代碼示意性地示出了由樁產(chǎn)生器生成的,由應用類加載器 加載的上述將由租戶特定類加載器加載的類E,的樁E,,的定義。其中 括號中的內(nèi)容是對這個樁E,,中所包括的相應內(nèi)容的解釋。
Class E,,(樁)
〃Parent Class
PEpe (抽象父類的實例,以后會有類E,的實例的引用) 〃Public Attribute Variables
name, age, clazzC
"Construction Method (構造方法,用來產(chǎn)生樁E,,的實例并初始化pe)
.Get TenantID (取得當前租戶的身份)
.Get TenantCL (根據(jù)當前租戶身份取得租戶特定類加載
器的實例)
pe= TenantCL.load(E,).newInstance(...)(調(diào)用租戶特定 類加載器的實例來加載類E,并生成對應的實例,并初始化pe)
〃 Static Variable Invoker Method
Get TenantID (取得當前租戶的身份)
Get TenantCL (根據(jù)當前租戶身份取得租戶特定類加載 器的實例)
New instance e'of E' and invoke e,.counter in TenantCL (調(diào)
用租戶特定類加載器中的類E,的實例e,來取得租戶特定的靜態(tài)變量 的值。
歸ethod
Set variables from current to pe (將當前類E,,(極)實
例的變量值復制到pe中,以便把變量值傳遞給租戶特定類加載器中 類的實例)
Invoke pe.ml ()(調(diào)用pe的同名方法)
Store variables from pe to current (將pe中變量j直復制到 當前類E,,(樁)實例中,以便把租戶特定類加載器中類的實例的變 量值復制到當前類E,,(樁)實例中)
〃Static Method
Get TenantID (取得當前租戶的身份)
Get TenantCL (根據(jù)當前租戶身份取得租戶特定類加載 器的實例)
New instance e' of E' and invoke e,.sl ( ) in TenantCL (調(diào)
用租戶特定類加載器中的實例來調(diào)用其靜態(tài)方法。
上面示意性地描述了在一個類E由于具有靜態(tài)變量counter,因此需要在各個租戶之間隔離的情況下,相應的隔離類E,以及樁E,,。 本領域的技術人員可以理解,在一個類由于是單態(tài)模式的,因此需 要在各個租戶之間隔離的情況下,其相應的隔離類以及樁。
更進一步地,本領域的技術人員還可以理解,定制類的相應的樁。
本領域的技術人員還可以理解,在本發(fā)明中,類的隔離和定制 的實現(xiàn)是可以用同一種方法解決的。因此,對于隔離類和定制類, 用的樁都是一樣的。其實能實現(xiàn)隔離和定制是因為,每個租戶特定 類加載器都有自己的一個"加載路徑",通過將隔離和定制類,如類 "E",和圖3中的類304,放到相應的"加載路徑"中,那么在運行時,該 隔離和定制類就自動的被租戶特定類加載器而加載起來了 。
在本發(fā)明的一個實施方式中,類加載器層次結構中的每一層中 的租戶公用類加載器,都可以有相應的租戶特定類加載器。
圖5示意性地示出了類加載器層次結構中的每一層中的租戶公 用類加載器,都具有相應的租戶特定類加載器的情況。
在本發(fā)明的一個實施方式中,如圖5所示,該類加載器層次結 構500包括3層類加載器(如圖5中的實線方框所示),每一層中 的租戶公用類加載器都具有相應的租戶特定類加載器(如圖5中的 實線圓圏中的虛線方框所示)。
中支持多租戶隔離和/或多租戶定制的方法的流程圖。
首先,在步驟S620,確定應用程序的哪些類需要進行隔離和/或
哪些類需要被定制。
然后,在步驟S630,為隔離類和/或定制類產(chǎn)生樁(代表類)。 然后,在步驟S640,由租戶公用類加載器加載所述樁和其他不
需要進行隔離的類和沒有被定制的類,以及由租戶特定類加載器加
載隔離類和/或定制類。
然后,在步驟S650,轉(zhuǎn)換引用被隔離類和/或被定制類的類的字
節(jié)碼,使其變成引用隔離類和/或定制類的樁。
16在被隔離類包括靜態(tài)變量的情況下,轉(zhuǎn)換引用被隔離類和/或被
定制類的類的字節(jié)碼,使其變成引用隔離類和/或定制類的樁包括 將引用靜態(tài)變量的類的字節(jié)碼中的getstatic或putstatic指令轉(zhuǎn)換成 invokestatic指令,該invokestatic指令調(diào)用所述樁中的靜態(tài)方法來操 作靜態(tài)變量。
然后,在需要時,在步驟S660,通過租戶公用類加載器創(chuàng)建所 述樁的實例和其他不需要進行隔離的類和沒有被定制的類的實例, 以及通過租戶特定類加載器創(chuàng)建隔離類和/或定制類的實例。
其中通過所述樁和/或所述樁的實例,可以實現(xiàn)與由租戶特定類 加載器加載的類和/或其實例通信。
其中,租戶公用類加載器可以包括應用類加載器。租戶特定類加 載器可以例如是一個在MT Enhance JVM中預定義的類,就像在普 通JVM里面的JDK中的類一樣。當需要時,它會被加載起來進行相 應的操作。
其中,可以在應用程序#1開發(fā)人員編寫好之后,確定該應用程序 中的哪些類由于具有靜態(tài)變量或是單態(tài)模式的等原因,需要在各個 禾且戶之間隔離。
在本發(fā)明的一個實施方式中,還包括步驟S610,在步驟S610, 識別租戶身份。
一旦請求者登陸系統(tǒng),確定當前請求者的租戶身份。更具體地說, 可以通過讓請求者登陸系統(tǒng)時,其需要輸入其租戶名,或者通過請 求者的URL等,識別租戶的身份。
并且,在該實施方式中,在步驟S620,根據(jù)租戶身份,確定應 用程序的那些類需要被定制。
如前文所述,租戶可以在注冊到系統(tǒng)中時提出定制要求。系統(tǒng)可 以將定制要求和租戶身份相結合地存儲在其中。這樣,就可以根據(jù) 租戶身份,確定應用程序的那些類需要被定制。
在本發(fā)明的一個實施方式中,其中對于類加載器層次結構中的每 一層中的租戶公用類加載器,都有相應的租戶特定類加載器。應當注意,為了使本發(fā)明更容易理解,上面的描述省略了對于本 領域的技術人員來說是公知的、并且對于本發(fā)明的實現(xiàn)可能是必需 的更具體的 一 些技術細節(jié)。
提供本發(fā)明的說明書的目的是為了說明和描述,而不是用來窮舉 或?qū)⒈景l(fā)明限制為所公開的形式。對本領域的普通技術人員而言, 許多修改和變更都是顯而易見的。本領域技術人員還應該理解,可 以通過軟件、硬件、固件或者它們的結合的方式,來實現(xiàn)本發(fā)明實 施例中的方法和裝置。例如,本發(fā)明可以實現(xiàn)為一種計算機程序產(chǎn) 品,包含存儲在計算機可讀的介質(zhì)上的程序代碼,其在被計算機執(zhí) 行時執(zhí)行本發(fā)明實施例中所述的方法。
因此,選擇并描述實施方式是為了更好地解釋本發(fā)明的原理及其 實際應用,并使本領域普通技術人員明白,在不脫離本發(fā)明實質(zhì)的 前提下,所有修改和變更均落入由權利要求所限定的本發(fā)明的保護 范圍之內(nèi)。
18
權利要求
1.一種用于在JAVA虛擬機JVM中支持多租戶隔離和/或多租戶定制的系統(tǒng),包括確定器,用于確定應用程序的哪些類需要進行隔離和/或哪些類需要被定制;樁產(chǎn)生器,用于為隔離類和/或定制類產(chǎn)生樁;租戶公用類加載器,用于加載所述樁和不需要進行隔離的類和沒有被定制的類,以及租戶特定類加載器,用于加載隔離類和/或定制類;字節(jié)碼轉(zhuǎn)換器,用于轉(zhuǎn)換引用被隔離類和/或被定制類的類的字節(jié)碼,使其變成引用隔離類和/或定制類的樁;其中在需要時,通過租戶公用類加載器創(chuàng)建所述樁的實例和不需要進行隔離的類和沒有被定制的類的實例,以及通過租戶特定類加載器創(chuàng)建隔離類和/或定制類的實例;其中通過所述樁和/或所述樁的實例,可以實現(xiàn)與租戶特定類加載器加載的類和/或其實例通信。
2. 根據(jù)權利要求1所述的系統(tǒng),其中租戶公用類加載器包括應 用類加載器。
3. 根據(jù)權利要求1所述的系統(tǒng),其中被隔離的類包括靜態(tài)變量, 以及所述字節(jié)碼轉(zhuǎn)換器將引用靜態(tài)變量的類的字節(jié)碼中的getstatic 或putstatic指令轉(zhuǎn)換成invokestatic指令,該invokestatic指令調(diào)用所 述樁中的靜態(tài)方法來操作靜態(tài)變量。
4. 根據(jù)權利要求1所述的系統(tǒng),其中當應用程序被編寫完成后, 確定器就進行應用程序的哪些類需要進行隔離的確定。
5. 根據(jù)權利要求1所述的系統(tǒng),還包括 租戶身份識別器,用于識別租戶身份;其中所述確定器根據(jù)租戶身份,確定應用程序的哪些類需要被定制。
6. 根據(jù)權利要求1所述的系統(tǒng),其中對于類加載器層次結構中 的每一層中的租戶公用類加載器,都有相應的租戶特定類加載器。
7. —種用于在JAVA虛擬機JVM中支持多租戶隔離和/或多租戶 定制的方法,包括步驟確定多租戶應用程序的哪些類需要進行隔離和/或哪些類需要被 定制;為隔離類和/或定制類產(chǎn)生樁;由租戶公用類加載器加載所述樁和不需要進行隔離的類和沒有 被定制的類,以及由租戶特定類加載器加載隔離類和/或定制類;轉(zhuǎn)換引用被隔離類和/或被定制類的類的字節(jié)碼,使其變成引用 隔離類和/或定制類的樁;其中,在需要時,通過租戶公用類加載器創(chuàng)建所述樁的實例和不 需要進行隔離的類和沒有被定制的類的實例,以及通過租戶特定類 加載器創(chuàng)建隔離類和/或定制類的實例;其中通過所述樁和/或所述樁的實例,可以實現(xiàn)與由租戶特定類加載器加載的類和/或其實例通信。
8. 根據(jù)權利要求7所述的方法,其中租戶公用類加載器包括應 用類加載器。
9. 根據(jù)權利要求7所述的方法,其中被隔離的類包括靜態(tài)變量, 并且轉(zhuǎn)換引用被隔離類和/或被定制類的類的字節(jié)碼,使其變成引用 隔離類和/或定制類的樁包括將引用靜態(tài)變量的類的字節(jié)碼中的getstatic或putstatic指令轉(zhuǎn)換 成invokestatic指令,該invokestatic指令調(diào)用所述樁中的靜態(tài)方法來 操作靜態(tài)變量。
10. 根據(jù)權利要求7所述的方法,其中當應用程序被編寫完成后, 就進行應用程序的哪些類需要進行隔離的確定。
11. 根據(jù)權利要求7所述的方法,還包括 識別租戶身份;其中所述確定步驟根據(jù)租戶身份,確定應用程序的哪些類需要被定制。
12.根據(jù)權利要求7所述的方法,其中對于類加載器層次結構中 的每一層中的租戶公用類加載器,都有相應的租戶特定類加載器。
全文摘要
在JVM中支持多租戶隔離/多租戶定制的系統(tǒng)和方法。該系統(tǒng)包括確定器,確定應用程序的哪些類需要進行隔離和/或哪些類被定制;樁產(chǎn)生器,為隔離類和/或定制類產(chǎn)生樁;租戶公用類加載器,加載樁和不需要進行隔離的類和沒有被定制的類,以及租戶特定類加載器,加載隔離類和/或定制類;字節(jié)碼轉(zhuǎn)換器,用于轉(zhuǎn)換引用被隔離類和/或被定制類的類的字節(jié)碼,使其變成引用隔離類和/或定制類的樁;在需要時,樁的實例和其他不需要進行隔離的類和沒有被定制的類的實例,以及隔離類和/或定制類的實例被創(chuàng)建;其中通過樁和/或樁的實例,可以實現(xiàn)與由租戶特定類加載器加載的類和/或其實例通信。
文檔編號G06F9/44GK101639770SQ200810134398
公開日2010年2月3日 申請日期2008年7月30日 優(yōu)先權日2008年7月30日
發(fā)明者劉天成, 偉 孫, 安文豪, 王芝虎, 郭常杰, 波 高, 瑩 黃 申請人:國際商業(yè)機器公司