Java EE 7的高峰–使用EclipseLink的多租户示例
我喜歡看到EclipseLink仍然是Java持久性創(chuàng)新的中心,并且他們正在努力及時(shí)采用最新的動(dòng)態(tài)更新。 總的來(lái)說(shuō),我為一個(gè)較為保守的行業(yè)工作,我正在尋找的主要新功能是多租戶。 您可以從幻燈片中猜測(cè),該字段中的某些內(nèi)容應(yīng)該已經(jīng)可以與最新的EclipseLink 2.3.0一起使用。
多租戶將是什么樣子?
讓我們開(kāi)始看什么Oracle的琳達(dá)DeMichiel在過(guò)去幾年的JavaOne(對(duì)比宣布博客-后 ),也讓我們了解一下什么的早期草案(PDF)的JPA 2.1規(guī)范所提供的。 較容易的部分是早期草案。 在任何情況下,沒(méi)有一行提到“ Multitenan [t | cy]”。 因此,對(duì)于進(jìn)一步的迭代來(lái)說(shuō),這顯然仍然是一件大事。 在JavaOne策略主題演講 (幻燈片41,42)和JavaOne技術(shù)主題演講(PDF) (幻燈片25)中可以找到更多信息。 通用Java EE 7方法將為不同租戶支持同一應(yīng)用程序的單獨(dú)隔離實(shí)例。 映射應(yīng)由容器完成,并以某種方式可供應(yīng)用程序使用。 直到今天,這都是非常模糊的,幻燈片中唯一可用的具體代碼示例使用兩個(gè)注釋@Multitenant和@TenantDiscriminatorColumn引用了一些明顯的JPA相關(guān)示例。 嗯 這看起來(lái)對(duì)您不熟悉嗎?
今天有什么可能?
是的! EclipseLink(從2.??3.0版開(kāi)始-Indigo)使用承租人區(qū)分符列支持共享的多承租人表,從而允許將一個(gè)應(yīng)用程序重新用于多個(gè)承租人并將其所有數(shù)據(jù)放置在一起。 所有租戶共享相同的架構(gòu)而彼此之間不知道,并且可以照常使用非多租戶實(shí)體類(lèi)型。 但是請(qǐng)注意,這只是數(shù)據(jù)多租戶的一種可能方法。 這通常稱(chēng)為“專(zhuān)用數(shù)據(jù)庫(kù)”,因?yàn)樗凶鈶舻臄?shù)據(jù)都進(jìn)入一個(gè)單獨(dú)的數(shù)據(jù)庫(kù)中! 以下是基本原則: –應(yīng)用程序?qū)嵗幚矶鄠€(gè)租戶 – JPA必須隔離每個(gè)租戶的緩存 您可以在專(zhuān)用的EclipseLink Wiki頁(yè)面上查看所有詳細(xì)信息。 想要試駕嗎? 開(kāi)始吧。 像往常一樣先決條件(NetBeans,GlassFish,MySQL,如果需要更多幫助,請(qǐng)比較舊文章。)。 確保具有正確的EclipseLink依賴項(xiàng)(至少2.3.0)! 通過(guò)向?qū)?chuàng)建一個(gè)新實(shí)體,設(shè)置數(shù)據(jù)源和persistence.xml并將其命名為“客戶”。
如果啟動(dòng)您的應(yīng)用程序,則會(huì)看到EclipseLink在數(shù)據(jù)庫(kù)中創(chuàng)建類(lèi)似這樣的內(nèi)容。
讓我們使其成為一個(gè)多租戶實(shí)體。 添加以下注釋:
@Entity @Multitenant @TenantDiscriminatorColumn(name = "companyId", contextProperty = "company-tenant.code") public class Customer implements Serializable { //... }有多種用法選項(xiàng)可用于如何在具有@Multitenant實(shí)體類(lèi)型的應(yīng)用程序中使用EclipseLink JPA持久性單元。 由于不同的租戶將只能訪問(wèn)其行,因此必須配置持久層,以使來(lái)自不同租戶的實(shí)體不會(huì)出現(xiàn)在同一緩存中。 如果您比較詳細(xì)的方法(專(zhuān)用PC,每個(gè)租戶PC,每個(gè)租戶PU),您會(huì)發(fā)現(xiàn),到今天為止,您可以通過(guò)容器管理的PC或PU注入實(shí)現(xiàn)兩種可能的選擇。 讓我們首先嘗試最簡(jiǎn)單的方法。
專(zhuān)用持久性單元
在這種用法中,每個(gè)租戶都定義了一個(gè)持久性單元,應(yīng)用程序/容器必須為其租戶請(qǐng)求正確的PersistenceContext或PersistenceUnit。 只有一個(gè)持久性單元,沒(méi)有共享的內(nèi)容。 繼續(xù)上面的示例,然后將以下屬性添加到persistence.xml中:
試試看,比較表。
如您所見(jiàn),現(xiàn)在您有了companyId列。 如果插入一些數(shù)據(jù),它將始終被在persistence.xml中分配的屬性值填充。 使用@PersistenceContext或@PersistenceUnit訪問(wèn)您的實(shí)體。 使用這種方法,您可以像平常一樣為應(yīng)用程序共享一個(gè)緩存。
| 具有共享緩存的@PersistenceContext(來(lái)源:S.Smith) |
每個(gè)租戶的持久性上下文
如果不想每個(gè)應(yīng)用程序有一個(gè)租戶,則可以決定在persistence.xml中具有一個(gè)持久性單元定義,并在應(yīng)用程序中具有一個(gè)共享的持久性單元(EntityManagerFactory和緩存)。 在這種情況下,需要在運(yùn)行時(shí)為每個(gè)EntityManager指定承租人上下文。 在這種情況下,您可以使用常規(guī)實(shí)體類(lèi)型的共享緩存,但是@Multitenant類(lèi)型必須在緩存中受到保護(hù)。 您可以通過(guò)指定一些屬性來(lái)做到這一點(diǎn):
| 每個(gè)租戶共享@PersistenceUnit(來(lái)源:S.Smith) |
鑒別方法
上面的示例使用單個(gè)區(qū)分符租戶列。 您可以通過(guò)指定primaryKey屬性,將discriminator列添加到PK,如下所示:
如果執(zhí)行以下操作,則也可能使用多個(gè)表使用多個(gè)租戶區(qū)分符列:
@Entity @SecondaryTable(name = "TENANTS") @Multitenant @TenantDiscriminatorColumns({@TenantDiscriminatorColumn(name = "TENANT_ID", contextProperty = "company-tenant.id", length = 20, primaryKey = true),@TenantDiscriminatorColumn(name = "TENANT_CODE", contextProperty = "company-tenant.code", discriminatorType = DiscriminatorType.STRING, table = "TENANTS") })這將導(dǎo)致輔助租戶表。
其他物品
與往常一樣,您也只能在persistence.xml中進(jìn)行完整的配置。 作為參考,請(qǐng)查看已經(jīng)提到的Wiki頁(yè)面。 最后一件事很有趣。 您也可以將“租戶區(qū)分符”列與您的實(shí)體對(duì)應(yīng)。 您只需確保未更新或插入它即可。
查看調(diào)試輸出,您可以了解幕后情況:
INFO:獲取EntityManager
INFO:插入測(cè)試客戶
FEIN:插入客戶(ID,TENANT_ID)值(?,?) 綁定=> [1,2] FEIN:插入租戶(ID,TENANT_CODE)的值(?,?) 綁定=> [1,TENANT2] FEIN:從客戶t0,租戶t1中選擇t0.ID,t1.TENANT_CODE,t0.TENANT_ID,t1.ID((((t1.ID = t0.ID)和(t1.TENANT_CODE =?)))和(t0.TENANT_ID =?)) 綁定=> [TENANT2,2]
是否對(duì)更多Java EE 7和JPA 2.1好東西感興趣? 使用EclipseLink JPA 2.1項(xiàng)目的開(kāi)發(fā)狀態(tài)Wiki頁(yè)面保持更新。
參考: Java EE 7的最高峰–來(lái)自我們JCG合作伙伴的 EclipseLink的多租戶示例 ? Markus Eisele在Enterprise Software Development with Java博客上。
翻譯自: https://www.javacodegeeks.com/2012/02/sneak-peak-at-java-ee-7-multitenant.html
總結(jié)
以上是生活随笔為你收集整理的Java EE 7的高峰–使用EclipseLink的多租户示例的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 如何设置新路由器如何调新路由器
- 下一篇: Java堆空间– JRockit和IBM