Java EE 7的高峰–使用EclipseLink的多租戶示例

水族館是有關所有相關規范和參考實現中有關Java EE進度的靈感和最新信息的重要來源。 他們從Oracle的Shaun Smith( 博客 / twitter )獲得了關于EclipseLink作為開源項目的地位和未來的演講。 他介紹了將在EclipseLink 2.4中提供的所有新功能,這些功能將與June Eclipse Juno發行版一起提供。 詳細來說,這些是REST,NoSQL和Multitenancy。 (詳細信息請參閱marsjug事件的完整幻燈片(PDF) 。)

我喜歡看到EclipseLink仍然是Java持久性創新的中心,并且他們正在努力及時采用最新的動態更新。 總的來說,我為一個較為保守的行業工作,我正在尋找的主要新功能是多租戶。 您可以從幻燈片中猜測,該字段中的某些內容應該已經可以與最新的EclipseLink 2.3.0一起使用。

多租戶將是什么樣子?
讓我們開始看什么Oracle的琳達DeMichiel在過去幾年的JavaOne(對比宣布博客-后 ),也讓我們了解一下什么的早期草案(PDF)的JPA 2.1規范所提供的。 較容易的部分是早期草案。 在任何情況下,沒有一行提到“ Multitenan [t | cy]”。 因此,對于進一步的迭代來說,這顯然仍然是一件大事。 在JavaOne策略主題演講 (幻燈片41,42)和JavaOne技術主題演講(PDF) (幻燈片25)中可以找到更多信息。 通用Java EE 7方法將為不同租戶支持同一應用程序的單獨隔離實例。 映射應由容器完成,并以某種方式可供應用程序使用。 直到今天,這都是非常模糊的,幻燈片中唯一可用的具體代碼示例使用兩個注釋@Multitenant和@TenantDiscriminatorColumn引用了一些明顯的JPA相關示例。 嗯 這看起來對您不熟悉嗎?

今天有什么可能?
是的! EclipseLink(從2.??3.0版開始-Indigo)使用承租人區分符列支持共享的多承租人表,從而允許將一個應用程序重新用于多個承租人并將其所有數據放置在一起。 所有租戶共享相同的架構而彼此之間不知道,并且可以照常使用非多租戶實體類型。 但是請注意,這只是數據多租戶的一種可能方法。 這通常稱為“專用數據庫”,因為所有租戶的數據都進入一個單獨的數據庫中! 以下是基本原則: –應用程序實例處理多個租戶 – JPA必須隔離每個租戶的緩存 您可以在專用的EclipseLink Wiki頁面上查看所有詳細信息。 想要試駕嗎? 開始吧。 像往常一樣先決條件(NetBeans,GlassFish,MySQL,如果需要更多幫助,請比較舊文章。)。 確保具有正確的EclipseLink依賴項(至少2.3.0)! 通過向導創建一個新實體,設置數據源和persistence.xml并將其命名為“客戶”。

@Entity
public class Customer implements Serializable {
//...
}

如果啟動您的應用程序,則會看到EclipseLink在數據庫中創建類似這樣的內容。

讓我們使其成為一個多租戶實體。 添加以下注釋:

@Entity
@Multitenant
@TenantDiscriminatorColumn(name = "companyId", contextProperty = "company-tenant.code")
public class Customer implements Serializable {
//...
}

有多種用法選項可用于如何在具有@Multitenant實體類型的應用程序中使用EclipseLink JPA持久性單元。 由于不同的租戶將只能訪問其行,因此必須配置持久層,以使來自不同租戶的實體不會出現在同一緩存中。 如果您比較詳細的方法(專用PC,每個租戶PC,每個租戶PU),您會發現,到今天為止,您可以通過容器管理的PC或PU注入實現兩種可能的選擇。 讓我們首先嘗試最簡單的方法。

專用持久性單元
在這種用法中,每個租戶都定義了一個持久性單元,應用程序/容器必須為其租戶請求正確的PersistenceContext或PersistenceUnit。 只有一個持久性單元,沒有共享的內容。 繼續上面的示例,然后將以下屬性添加到persistence.xml中:

<property name="company-tenant.code" value="TENANT1" />

試試看,比較表。

如您所見,現在您有了companyId列。 如果插入一些數據,它將始終被在persistence.xml中分配的屬性值填充。 使用@PersistenceContext或@PersistenceUnit訪問您的實體。 使用這種方法,您可以像平常一樣為應用程序共享一個緩存。

具有共享緩存的@PersistenceContext(來源:S.Smith)

每個租戶的持久性上下文
如果不想每個應用程序有一個租戶,則可以決定在persistence.xml中具有一個持久性單元定義,并在應用程序中具有一個共享的持久性單元(EntityManagerFactory和緩存)。 在這種情況下,需要在運行時為每個EntityManager指定承租人上下文。 在這種情況下,您可以使用常規實體類型的共享緩存,但是@Multitenant類型必須在緩存中受到保護。 您可以通過指定一些屬性來做到這一點:

@PersistenceUnit
EntityManagerFactory emf;
Map props = new HashMap();
props.put("company-tenant.code", "TENANT2");
props.put(PersistenceUnitProperties.MULTITENANT_SHARED_EMF, true);
EntityManager em = emf.createEntityManager(props);
每個租戶共享@PersistenceUnit(來源:S.Smith)

鑒別方法
上面的示例使用單個區分符租戶列。 您可以通過指定primaryKey屬性,將discriminator列添加到PK,如下所示:

@TenantDiscriminatorColumn(name = "companyId", contextProperty = "company-tenant.code", primaryKey = true)

如果執行以下操作,則也可能使用多個表使用多個租戶區分符列:

@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")
})

這將導致輔助租戶表。

其他物品
與往常一樣,您也只能在persistence.xml中進行完整的配置。 作為參考,請查看已經提到的Wiki頁面。 最后一件事很有趣。 您也可以將“租戶區分符”列與您的實體對應。 您只需確保未更新或插入它即可。

@Basic@Column(name = "TENANT_ID", insertable = false, updatable = false)private int tenantId;public int getTenantId() {return tenantId;}

查看調試輸出,您可以了解幕后情況:

INFO:獲取EntityManager
INFO:插入測試客戶
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]

是否對更多Java EE 7和JPA 2.1好東西感興趣? 使用EclipseLink JPA 2.1項目的開發狀態Wiki頁面保持更新。

參考: Java EE 7的最高峰–來自我們JCG合作伙伴的 EclipseLink的多租戶示例 ? Markus Eisele在Enterprise Software Development with Java博客上。


翻譯自: https://www.javacodegeeks.com/2012/02/sneak-peak-at-java-ee-7-multitenant.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/373776.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/373776.shtml
英文地址,請注明出處:http://en.pswp.cn/news/373776.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

vscode中如何拉取git代碼_使用VSCode如何從github拉取項目的實現

使用VSCode如何從github拉取項目的實現最近使用vscode進行前端編程&#xff0c;遇到一些問題網上說明的不是很明顯&#xff0c;故記錄一下1.開vscode使用CTRL或者點擊查看到集成終端打開控制終端到此這篇關于使用VSCode如何從github拉取項目的實現的文章就介紹到這了,更多相關V…

matlab求導

在matlab中求導要進行符號運算。 >>syms x; >>y x^cos(x); >>ydot diff(y, x, 1);%對x求一階導數 ydot x^(cos(x) - 1)*cos(x) - x^cos(x)*log(x)*sin(x) >> y2dot diff(y, x, 2)%求二階導數&#xff0c;求n階導數同理。 y2dot cos(x)*(x…

帶有Java和Axis2的JSON Web服務

我最近遇到一位客戶&#xff0c;要求我使用Java Web服務重建其舊產品。 他們希望它模塊化并且易于使用。 我想到的第一件事是使用寧靜的方法。 但是讓我煩惱的是&#xff0c;Java寧靜的方法是使用XML !&#xff0c;我更喜歡一種更簡單的通信方式&#xff0c;易于理解和解析的數…

Kosaraju算法 有向圖的強連通分量

有向圖的強連通分量即&#xff0c;在有向圖G中&#xff0c;如果兩個頂點間至少存在一條路徑&#xff0c;稱兩個頂點強連通(strongly connected)。如果有向圖G的每兩個頂點都強連通&#xff0c;稱G是一個強連通圖。非強連通圖有向圖的極大強連通子圖&#xff0c;稱為強連通分量(…

監管大屏系統_工廠大屏可視化管控系統,智慧工廠平臺是什么,工廠管理大屏軟件 - 帆軟...

智慧工廠大屏可視化管控系統&#xff0c;不但注重顯示數據顯示信息能力&#xff0c;還要兼具監管的作用&#xff0c;配合時代新興的大屏技術&#xff0c;早已成為精益生產工廠的必備產品。本文權威介紹智慧工廠大屏可視化管控系統是什么&#xff0c;以及3款主流軟件&#xff0c…

圖像二維離散傅里葉變換、幅度譜、相位譜

clear, clc I imread(...);F fftshift(fft2(I)); % 對圖像進行二維 DFT(fft2)&#xff0c;并移至中心位置 magn log(abs(F)); % 加 log 是便于顯示&#xff0c;縮小值域 phase log(angle(F)*180/pi); % 轉換為度數…

詳解CSS選擇器、優先級與匹配原理

選擇器種類 嚴格來講&#xff0c;選擇器的種類可以分為三種&#xff1a;標簽名選擇器、類選擇器和ID選擇器。而所謂的后代選擇器和群組選擇器只不過是對前三種選擇器的擴展應用。而在標簽內寫入style""的方式&#xff0c;應該是CSS的一種引入方式&#xff0c;而不是選…

關于299$的企業開發者賬號的申請流程

299$的企業開發者賬號 Apple Developer Enterprise Program?一年1988人民幣 - 企業 (Apple Developer Enterprise Program)- 公司應在鄧白氏注冊并擁有有效的 DUNS 號碼。&#xff0d;此計劃使開發者能夠開發針對 Apple 設備的應用程式&#xff0c;并對其員工進行發布&#xf…

keras 多層lstm_tensorflow-如何在keras中堆疊多個lstm?

DanielAdiwardana的答案的詳細說明。我們需要為除最后一層之外的所有LSTM層添加return_sequences True。將此標志設置為True可讓Keras知道LSTM輸出應包含所有歷史生成的輸出以及時間戳(3D)。 因此&#xff0c;下一個LSTM層可以進一步處理數據。如果此標志為假&#xff0c;則LS…

Java堆空間– JRockit和IBM VM

本文將為您提供JRockit Java堆空間與HotSpot VM的概述。 它還將為您提供有關JRockit和HotSpot的Oracle未來計劃的一些背景知識。 Oracle JRockit VM Java堆&#xff1a;2個不同的內存空間 -Java堆&#xff08;YoungGen和OldGen&#xff09; -本機內存空間&#xff08;類池&am…

如何搭建lamp(CentOS7+Apache+MySQL+PHP)環境 [轉]

在網上搜資料,自己在本地虛擬機上嘗試搭建,弄了整整一天一夜,終于弄好了.網上的資料,雖然很多,但大多都是重復的,拿去試了之后,又很多都不能得到正確的結果.最終找到了適合我的linux環境的搭建方式;在這里貼出來:Install Apache, PHP And MySQL On CentOS 7 (LAMP)度娘真不給力…

為什么要用!DOCTYPE聲明

實例&#xff1a; 我們經常會看到類似這樣的代碼&#xff1a; <!DOCTYPE html> <html> <head> <title>文檔的標題</title> </head> <body> 文檔的內容...... </body> </html>注解&#xff1a;可以看到最上面有一行關于“…

java 線程的開始、暫停、繼續

Android項目中的一個需求&#xff1a;通過線程讀取文件內容&#xff0c;并且可以控制線程的開始、暫停、繼續&#xff0c;來控制讀文件。在此記錄下。 直接在主線程中&#xff0c;通過wait、notify、notifyAll去控制讀文件的線程&#xff08;子線程&#xff09;&#xff0c;報錯…

為什么要在Java中使用Unchecked異常而不是Checked異常

關于檢查與未檢查的異常的爭論可以追溯到過去。 有人說這是Java包含的最佳功能之一。 其他人則說這是他們最大的錯誤之一[ 1 ]。 辯論似乎結束了。 在這篇文章中&#xff0c;我將嘗試包含指向該主題的文章和書籍的鏈接。 我不是專家&#xff0c;但是我會盡力向您解釋為什么我得…

batchplot插件用法_Batchplot批量打印怎么用?Batchplot批量打印教程

很多從事CAD設計工作的用戶都碰到過這種情況&#xff1a;在一個單DWG格式的圖紙文件中包含有大量圖紙&#xff0c;如果一張一張選取打印不但費時費力&#xff0c;而且容易遺漏某張圖紙&#xff0c;這時候就需要用到Batchplot插件&#xff0c;這是專門針對單DWG多圖紙的批量打印…

選擇排序和冒泡排序以及折半查找

1.選擇排序 2.冒泡排序 3.折半查找 方式一&#xff1a;開發使用的方法 方式二&#xff1a;普通的折半 轉載于:https://www.cnblogs.com/juncaoit/p/5935068.html

JSP中Request屬性范圍

JSP屬性范圍&#xff0c;通過以下幾個測試代碼來學習request屬性的范圍 測試一(JSP動態指令方式傳參)&#xff1a; 測試內容&#xff1a; <jsp:param .../>添加參數,通過<jsp:forward page"...">來實現服務器端跳轉,以此來測試request屬性的范圍&#…

Spring MVC – Flash屬性

最新的Spring Framework版本&#xff08;3.1&#xff09;帶來了有趣的功能&#xff0c;稱為Flash屬性。 這是對我很久以前在我的一篇文章中提到的問題的補救措施&#xff1a; Spring MVC –會話屬性處理。 這個問題可以用幾句話來形容&#xff1a;如果我們想通過兩個控制器之間…

000 快速排序算法

一&#xff1a;概述 快速排序是東尼.霍爾所發展的一種快速排序算法。 對于n個項目的排序&#xff0c;平均O&#xff08;n*logn&#xff09;次比較&#xff0c;在比較糟糕的情況下是O&#xff08;n2&#xff09;次比較。 采用分治策略把一個串行分為兩個子串行。 二&#xff1a;…

nginx post請求超時_nginx記錄分析網站響應慢的請求(ngx_http_log_request_speed)

nginx模塊ngx_http_log_request_speed可以用來找出網站哪些請求很慢&#xff0c;針對站點很多&#xff0c;文件以及請求很多想找出哪些請求比較慢的話&#xff0c;這個插件非常有效.作者的初衷是寫給自己用的&#xff0c;用來找出站點中處理時間較長的請求, 這些請求是造成服務…