
一般的做法
您可以將Coherence API與通過JPA映射的數據庫支持的緩存一起使用。 網格通過JPA CacheLoader和CacheStore實現訪問關系數據。 在這種“傳統”一致性方法中,TopLink Grid提供了針對EclipseLink JPA優化的CacheLoader和CacheStore實現。 (EclipseLinkJPACacheLoader和EclipseLinkJPACacheStore)都包含在toplink-grid.jar文件中。 這樣,您將使用標準的JPA運行時配置文件persistence.xml和JPA映射文件orm.xml。 必須指定Coherence緩存配置文件coherence-cache-config.xml來覆蓋默認的Coherence設置并定義CacheStore緩存方案。
細節
CacheLoader實現通過EclipseLink將所有讀取操作/查詢直接重定向到數據庫。 CacheStore負責使用EclipseLink對數據庫執行的所有寫操作(插入,更新,刪除)。 該解決方案基本上獨立于GlassFish及其JPA提供程序。 您只需將Coherence與它的本機API一起使用,并且Coherence負責持久化實體。 該方法在文檔中稱為“傳統相干配置”。
制備
為了使該示例和以下每個示例都能正常工作,我們需要做一些準備。 首先是獲得所有必需的軟件。 獲得Java SE開發套件6u23 , GlassFish 3.1(NetBeans的一部分) , MySQL Community Server(5.5.9) , TopLink(11.1.1.4.0)和Coherence( 3.6.1.0)的副本 。 任何IDE都可以。 我將所有示例都基于NetBeans 7.0 Beta2 。 您應該首先安裝零碎的零件。 使用MySQL創建一個空的“一致性”數據庫。 我們將在所有示例中使用此示例。 我不會指導您完成此操作。 我將從相關的一致性部分開始。 這也是您需要遵循本系列其他部分的配置。 所以你最好保留它;)
將您的Coherence下載文件解壓縮到合適的位置(例如x:\ Oracle \ coherence \),然后通過設置并運行示例緩存服務器應用程序來檢查安裝。 轉到\ bin文件夾,然后執行cache-server.cmd / sh。 在此之前,請確保JAVA_HOME變量指向有效的JDK安裝。 如果一切順利,您會收到消息:“ Started DefaultCacheServer…”。 一個簡單的旁注:一致性是群集感知的。 這意味著,它將自動嘗試發現您子網中其他正在運行的Coherence節點。 如果您看到“ ActualMemberSet = MemberSet(Size = 1)”以外的任何其他輸出,則應在此處停止并將Coherence配置為僅在計算機上運行 。太好了,所有設置。讓我們執行示例客戶端。啟動coherence.cmd / sh并等待輸出“ Map(?):”。如果您使用服務器控制臺進行檢查,將看到以下內容:
(thread=Cluster, member=1): Member 2 joined Service Management with senior member 1
試一試,然后嘗試以下命令,每個命令均以返回確認:幫助,緩存myCache,輸入消息“ hello”,獲取消息,大小,列表,再見。 要獲得更多幫助,請查閱教程 。
付諸實踐
使用NetBeans啟動一個新的Java / Java類庫項目。 將其命名為“ GridEntityExample”(選中專用的lib文件夾框)。 將coherence.jar,toplink-grid.jar和mysql-connector-java-5.1.13-bin.jar添加到lib文件夾中,并將它們添加到項目依賴項中。
添加兩個新的程序包實體和服務器(例如net.eisele.coherence.entities,net.eisele.coherence.server),并
由于我們已經有了緩存服務器示例,因此很容易對其進行修改以滿足我們的需求。 將新的實體類(員工)添加到實體包中。 將主鍵類型更改為“ int”,然后單擊下一步。 從下拉框中選擇EclipseLink JPA 2.0。 由于向導將不允許您完成操作,因此請創建一個新的數據庫連接(jdbc:mysql:// localhost:3306 / coherence),然后單擊完成。 將兩個私有字符串(firstName,lastName)及其獲取器和設置器添加到實體。 從id屬性中刪除@GeneratedValue(稍后會詳細介紹)。 persistence.xml中的一些調整完成了配置。 添加以下內容:
<property name="eclipselink.ddl-generation" value="create-tables" />
<property name="eclipselink.ddl-generation.output-mode"
value="database" />
<property name="eclipselink.jdbc.read-connections.min" value="1" />
<property name="eclipselink.jdbc.write-connections.min" value="1" />
<property name="eclipselink.jdbc.batch-writing" value="JDBC" />
<property name="eclipselink.logging.level" value="FINE" />
<property name="eclipselink.logging.thread" value="false" />
<property name="eclipselink.logging.session" value="false" />
<property name="eclipselink.logging.exceptions" value="false" />
<property name="eclipselink.logging.timestamp" value="false"/>
現在,我們需要一個簡單的StartCacheServer類,該類應抵抗服務器軟件包。 給它一個簡單的主要方法:
public static void main(String[] args) throws UnknownHostException {
// Restrict Coherence to localhost
System.setProperty("tangosol.coherence.wka", InetAddress.getLocalHost().getHostAddress());// Start CacheServer
DefaultCacheServer.main(new String[0]);
}
現在我們必須配置一致性。 這是通過coherence-cache-config.xml文件完成的。 完整的文件可以在教程中找到 。 成功的關鍵是class方案的第二個init參數。 您必須從那里的persistence.xml引用持久性單元:
<init-param>
<param-type>java.lang.String</param-type>
<param-value>GridEntityExamplePU</param-value>
</init-param>
右鍵單擊StartCacheServer并運行它。 您應該看到已經知道的消息:“ Started DefaultCacheServer…”。
好。 現在,我們將第一位員工插入數據庫。 創建一個簡單的InsertExample類:
public static void main(String[] args) throws UnknownHostException {
// Restrict Coherence to localhost
System.setProperty("tangosol.coherence.wka", InetAddress.getLocalHost().getHostAddress());// Disable local storage--need to start independent CacheServer
System.setProperty("tangosol.coherence.distributed.localstorage", "false");// Get the configured Cache
NamedCache cache = CacheFactory.getCache("Employee");//Create a new Employee
Employee emp = new Employee();
emp.setFirstName("Markus");
emp.setLastName("Eisele");
emp.setId(1);//Put the Employee into the cache
cache.put(1, emp);
}
運行它并檢查您的數據庫,是否有新創建的Employee。 它應該是 :)
做完了 就這樣。 好的,GlassFish部分到底在哪里?
在GlassFish中使用此方法
這很簡單。 創建一個新的域(我們稱其為一致性),并創建一個新的WebApplication(將其稱為GridEntityWeb)。 添加GridEntityExample項目和coherence.jar作為依賴項。 現在,您必須配置緩存。 再次通過coherence-cache-config.xml完成??。 在WEB-INF / classes中創建一個,并使其引用EclipseLinkJPA服務名稱。
<cache-config><caching-scheme-mapping>
<cache-mapping>
<cache-name>*</cache-name>
<scheme-name>distributed-eclipselink</scheme-name>
</cache-mapping>
</caching-scheme-mapping><caching-schemes>
<distributed-scheme>
<scheme-name>distributed-eclipselink</scheme-name>
<service-name>EclipseLinkJPA</service-name>
</distributed-scheme>
</caching-schemes></cache-config>
就這樣。 確保StartCacheServer正在運行,并啟動GlassFish域和應用程序。 如果僅從InsertExample中復制幾行,則可以快速測試是否一切正常。 現在剩下要做的就是找到一種干凈的方法將其集成到您的應用程序中。 也許您可以提出一個通用的Coherence Crud服務(可能基于Adam的建議 )。
缺點和想法
使用這種方法時,必須配置持久性單元,以確保在插入或更新實體時不對實體進行任何更改。 JPA提供程序對實體所做的任何更改都不會反映在Coherence緩存中。 這意味著緩存中的實體將與數據庫內容不匹配。 特別是,實體不應使用ID生成(例如@GeneratedValue)來獲取ID。 這意味著,為了將對象插入Coherence緩存中,您還需要提供其身份作為鍵。
ID通常是實體存儲在Coherence中的密鑰。 不應使用樂觀鎖定(例如,@ Version),因為它可能導致數據庫事務提交失敗。
因此,總的來說,這并不是真正的常用方法,它只適合您在處理大量數據的某些特殊情況下使用。
但是這里到底是什么交易。 讓我們看看:如果循環運行配置的示例并插入12.635 Employee對象,則在我的計算機上大約需要13分鐘。 如果在同步模式下運行Coherence,則會發生這種情況。 但是您可以利用稱為“后寫”的功能通過異步執行數據庫更新來縮短應用程序響應時間。 如果將一行添加到CacheServer的coherence-cache-config.xml:
<write-delay>10s</write-delay>
從應用程序角度出發,插入插件所需的時間減少到9秒! 當然,運行中的服務器仍然需要時間異步處理更新,但是對于客戶端來說,這是最佳行為。
現在足夠了。 我將嘗試通過示例解釋更多的概念。 正如您可能已經猜到的,是否使用緩存有很多要知道的地方。 下一部分將介紹Coherence作為帶有GlassFish的EclipseLink的L2緩存。 謝謝閱讀。 敬請關注。
參考: 具有GlassFish和一致性的高性能JPA –第2部分,來自我們的JCG合作伙伴 Markus Eisele ,在“使用Java進行企業軟件開發”博客中
- 具有GlassFish和一致性的高性能JPA –第1部分
- 具有GlassFish和一致性的高性能JPA –第3部分
- 在云中開發和測試
- Java EE中的配置管理
- 泄漏:Oracle WebLogic Server 12g
- Java EE6裝飾器:在注入時裝飾類
- Java教程和Android教程列表
翻譯自: https://www.javacodegeeks.com/2011/11/high-performance-jpa-with-glassfish-and_03.html