glassfish_具有GlassFish和一致性的高性能JPA –第3部分
glassfish
在我的四部分系列的第三部分中,我將說明將Coherence與EclipseLink和GlassFish結(jié)合使用的第二種策略。 這就是通過EclipseLink使用Coherence作為二級緩存(L2)的全部內(nèi)容。一般的做法
這種方法將Coherence數(shù)據(jù)網(wǎng)格應(yīng)用于依賴于數(shù)據(jù)庫托管數(shù)據(jù)的JPA應(yīng)用程序,這些數(shù)據(jù)無法完全預(yù)加載到Coherence緩存中。 它可能無法預(yù)加載的一些原因包括:超出Coherence篩選器功能集的極其復(fù)雜的查詢,創(chuàng)建陳舊緩存的第三方數(shù)據(jù)庫更新,依賴于本機SQL查詢,存儲過程或觸發(fā)器等。 這不僅是本地L2高速緩存的選項,而且在不同節(jié)點上具有其他已配置的Coherence實例,您還將獲得群集范圍的JPA L2高速緩存。
細(xì)節(jié)
與許多緩存一樣,這是一個只讀的優(yōu)化。 主鍵查詢嘗試首先從Coherence獲取實體,如果不成功,將查詢數(shù)據(jù)庫,并用查詢結(jié)果更新Coherence。 針對數(shù)據(jù)庫執(zhí)行非主鍵查詢,并針對Coherence檢查結(jié)果,以避免緩存實體的對象構(gòu)建成本。 新查詢的實體將放入Coherence。 寫入操作將更新數(shù)據(jù)庫,如果成功提交,則將更新后的實體放入Coherence。 這種方法在Coherence文檔中稱為“網(wǎng)格緩存”。
付諸實踐
如果您還沒有這樣做,請從上一篇博客文章開始,并準(zhǔn)備您的環(huán)境 。 只有一件事,您需要進(jìn)行更改。 對于這種情況,請返回GlassFish 3.0.1 / EclipseLink 2.0.1,因為CacheKey.getKey()方法存在問題。 2.0.1返回一個Vector ,而2.2.0返回一個Object 。 看到新的Oracle GlassFish Server 3.1支持ActiveCache,我希望此問題將在3.7 Coherence版本中得到修復(fù)。 但是直到那之前,您必須堅持使用舊的GF或EclipseLink。
無論如何,讓我們使用您喜歡的IDE(例如GridCacheExample)創(chuàng)建一個新的Web項目。 添加所需的庫(coherence.jar,toplink-grid.jar和eclipselink.jar)。 現(xiàn)在,讓我們創(chuàng)建我們的實體類,并向其添加額外的@CacheInterceptor批注:
...import oracle.eclipselink.coherence.integrated.cache.CoherenceInterceptor; import org.eclipse.persistence.annotations.CacheInterceptor;...@Entity @CacheInterceptor(value = CoherenceInterceptor.class) public class Employee implements Serializable {...}不要忘記添加@GeneratedValue(strategy = GenerationType.SEQUENCE),因為這與上一個示例相反。 完成此操作后,您必須將一致性配置添加到WEB-INF / classes文件夾。 您可以從教程開始( 示例2 )。 (請注意,其中有一個錯字…重復(fù)的</ backing-map-scheme>標(biāo)記)。 像配置普通的基于JPA的應(yīng)用程序一樣,配置persistence.xml。
<persistence-unit name="GridCacheExamplePU" transaction-type="JTA"><provider>org.eclipse.persistence.jpa.PersistenceProvider</provider> <jta-data-source>jdbc/coherence</jta-data-source><properties> <property name="eclipselink.ddl-generation" value="drop-and-create-tables"/> <property name="eclipselink.logging.level" value="FINE" /> </properties></persistence-unit>基本上就是這樣。 現(xiàn)在,您可以測試新的L2緩存。 一個簡單的servlet應(yīng)該可以解決問題:
public class InsertServletPart3 extends HttpServlet {@PersistenceUnit(unitName = "GridCacheExamplePU") EntityManagerFactory emf;@Resource UserTransaction tx;...EntityManager em = emf.createEntityManager();tx.begin();// some loop magic Employee employee = new Employee();employee.setFirstName("Markus"); employee.setLastName("Eisele");em.persist(employee);// some loop magic end tx.commit();em.close();如果您查看日志,則可以看到以下內(nèi)容:
FEIN: INSERT INTO EMPLOYEE (LASTNAME, FIRSTNAME) VALUES (?, ?)bind => [Eisele, Markus] ... FEIN: Coherence(Employee)::Put: 1 value: net.eisele.coherence.entities.Employee[ id=1 ] ...基本上,這告訴您,實際的數(shù)據(jù)庫插入是由您慣常的EclipseLink執(zhí)行的。 之后,您會看到Employee對象以PK為鍵放置到名為Employee的Coherence Cache中。
如果現(xiàn)在對數(shù)據(jù)庫發(fā)出查詢
em.createQuery("select e from Employee e where e.lastName = :lastName").setParameter("lastName", "Eisele").getResultList();您會看到以下內(nèi)容:
FEIN: SELECT ID, LASTNAME, FIRSTNAME FROM EMPLOYEE WHERE (LASTNAME = ?)bind => [Eisele] FEIN: Coherence(Employee)::Get: 1 result: net.eisele.coherence.entities.Employee[ id=1 ] FEIN: Coherence(Employee)::Put: 1 value: net.eisele.coherence.entities.Employee[ id=1 ] ...這告訴您,查詢本身是針對數(shù)據(jù)庫發(fā)出的,但結(jié)果針對Coherence進(jìn)行了檢查,以避免已經(jīng)為緩存的實體構(gòu)造對象。 新查詢的實體將放入Coherence。 如果發(fā)出簡單的PK查詢:
em.find(Employee.class, 1);輸出更改為:
FEIN: Coherence(Employee)::Get: 1 result: net.eisele.coherence.entities.Employee[ id=1 ]而且您根本看不到任何數(shù)據(jù)庫查詢。 就是這樣:)您的緩存有效! 謝謝閱讀。 敬請期待下一部分!
進(jìn)一步閱讀
- OTN方法:將一致性用作共享的L2緩存
- Oracle TopLink與Coherence Gird 11g第1版(11.1.1)集成指南
參考: 具有GlassFish和一致性的高性能JPA –我們的JCG合作伙伴 Markus Eisele在“使用Java進(jìn)行企業(yè)軟件開發(fā)”博客上的 第3部分
相關(guān)文章 :- 具有GlassFish和一致性的高性能JPA –第1部分
- 具有GlassFish和一致性的高性能JPA –第2部分
- 在云中開發(fā)和測試
- Java EE中的配置管理
- 泄漏:Oracle WebLogic Server 12g
- Java EE6裝飾器:在注入時裝飾類
- Java教程和Android教程列表
翻譯自: https://www.javacodegeeks.com/2011/11/in-this-third-part-of-my-four-part.html
glassfish
總結(jié)
以上是生活随笔為你收集整理的glassfish_具有GlassFish和一致性的高性能JPA –第3部分的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: (linux usb 驱动)
- 下一篇: 阿里云备案服务号在哪里买(阿里云备案号购