JPA 2.0 Vs Hibernate:緩存方法的差異(一)
原創(chuàng)【51CTO譯文】JPA(Java Persistence API)與Hibernate是兩個(gè)管理的持久性和對(duì)象關(guān)系映射ORM(object relational mapping)的Java EE和Java SE應(yīng)用的領(lǐng)先技術(shù)。開源的Hibernate是一個(gè)輕量級(jí)和透明的框架,簡(jiǎn)化了數(shù)據(jù)庫(kù)表映射到持久化類XML文件和生成的SQL腳本運(yùn)行時(shí)的ORM。而基于XML的JPA是則一個(gè)簡(jiǎn)單得多的ORM元數(shù)據(jù)注釋,取代了傳統(tǒng)的XML映射文件,使開發(fā)人員能夠通過Java應(yīng)用程序注解或XML描述對(duì)象關(guān)系表的映射關(guān)系,并將運(yùn)行期的實(shí)體對(duì)象持久化到數(shù)據(jù)庫(kù)中。(51CTO編輯特別推薦專題:Hibernate應(yīng)用開發(fā)教程)
EJB 3.0軟件專家組在2009年11月發(fā)布了***版本JPA 2.0(JSR 317),改進(jìn)了JPA 1.0版本中的一些基本功能:ORM功能、實(shí)體管理功能、查詢接口和Java持久化查詢語(yǔ)言(JPQL)。
作為JPA Provider中***大的Hibernate通過Hibernate Annotation和Hibernate EntityManager庫(kù)實(shí)施JPA。Hibernate EntityManager庫(kù)是JPA的完整實(shí)現(xiàn),它遵循的是JPA持久化特征,而Hibernate Annotation是除了標(biāo)準(zhǔn)化的JPA部分特定于Hibernate,它遵循自由化特征。Hibernate 從3.2開始,就開始兼容JPA。Hibernate3.2獲得了Sun TCK的JPA(Java Persistence API) 兼容認(rèn)證。2010年3月發(fā)布的Hibernate 3.5現(xiàn)在已經(jīng)完全兼容JPA 2.0。Hibernate Annotations、Hibernate EntityManager和Hibernate Envers已經(jīng)整合為JPA 2.0項(xiàng)目核心的部分。
是什么讓這兩個(gè)不同的ORM框架兼容的呢?在這篇文章中,我們將對(duì)JPA 2.0和Hibernate的緩存方法進(jìn)行一個(gè)簡(jiǎn)單的比較。首先,我們先介紹一下JPA 2.0緩存原理。
JPA 2.0緩存原理
緩存對(duì)應(yīng)用程序性能和數(shù)據(jù)庫(kù)訪問的優(yōu)化是必不可少的。通過存儲(chǔ)所需服務(wù)請(qǐng)求的數(shù)據(jù),減少訪問緩存從數(shù)據(jù)庫(kù)調(diào)用數(shù)據(jù)的時(shí)間。JPA 2.0支持兩個(gè)級(jí)別的緩存,JPA的一級(jí)緩存(L1)和JPA的二級(jí)緩存(L2)。
JPA的1級(jí)緩存
一個(gè)JPA entity manager使用的持久化上下文管理的框架。在持久性方面,與各自的entity manager作為***級(jí)緩存。在任何一個(gè)持久化對(duì)象的框架內(nèi),將一個(gè)entity manager只有一個(gè)點(diǎn)的對(duì)象映射到數(shù)據(jù)庫(kù)中特定的實(shí)例。當(dāng)另一個(gè)用戶不同的持久化對(duì)象,JPA圈定持久性對(duì)象的范圍,以減少訪問的時(shí)間。
持久性對(duì)象可以在任何程序執(zhí)行的過程中。在程序執(zhí)行的過程中,當(dāng)一個(gè)用戶在多個(gè)持久化對(duì)象之間來回調(diào)用,程序結(jié)束后馬上跳出。堅(jiān)持在一個(gè)不同的持久化對(duì)象之間進(jìn)行獨(dú)立實(shí)體的變化,而合并操作是在entity manager使用。
下面是一個(gè)例子:
- @Stateless
- public EmpDetailsBean implements EmpDetails {
- @PersistenceContext
- EntityManager entityManager;
- public Employee addEmployee(String empId, String empName, String empUni) {
- Employee employee = new Employee(empId, empName, empUnit);
- entityManager.persist(employee); //employee is managed entity
- return employee; //employee is detached entity
- }
- public Employee updateEmployee(Employee employee) {
- //employee is detached entity, employee1 is managed entity
- Employee employee1 = entityManager.merge(employee);
- return employee;
- }
- }
擴(kuò)大一下范圍,在多個(gè)持久化對(duì)象之間來回調(diào)用,因此對(duì)實(shí)體集并不是脫離,他們依然管理。擴(kuò)展的范圍適合應(yīng)用場(chǎng)合在用戶跨越多個(gè)請(qǐng)求。
下面是一個(gè)擴(kuò)大范圍的例子:
- @Stateful
- public EmpDetailsBean implements EmpDetails {
- @PersistenceContext(type=PersistenceContextType.EXTENDED)
- EntityManager entityManager;
- //Cached employee
- private Employee employee;
- public void addEmployee(String empId, String empName, String empUnit) {
- employee = new Employee(empId, empName, empUnit);
- entityManager.persist(employee); //employee is managed entity
- }
- public void updateEmployee(String empUnit) {
- employee.setUnit(empUnit); //employee is managed entity
- }
- }
然而,擴(kuò)大使用范圍,緩存的內(nèi)存消耗需要進(jìn)行評(píng)估,是利用緩存調(diào)用消耗少還是直接訪問數(shù)據(jù)庫(kù)方便。圖1顯示JPA 1級(jí)緩存。
JPA Level 1 (L1) Cache
#p#
JPA 2.0的二級(jí)緩存
二級(jí)緩存被引進(jìn)的JPA 2.0版本。JPA提供了基本的緩存操作的緩存API,而2級(jí)緩存共享狀態(tài)的實(shí)體跨越不同的持久化對(duì)象。 2級(jí)緩存的持久化對(duì)象的基礎(chǔ),這是高度透明的應(yīng)用程序。圖2顯示了JPA 2.0級(jí)緩存。
JPA Level 2 (L2) Cache
二級(jí)高速緩存通常是用來提高性能。但是,使用緩存可能會(huì)導(dǎo)致提取“陳舊”數(shù)據(jù),因此您可以選擇禁用緩存。
- public interface Cache {
- /**
- * Whether the cache contains data for the given entity.
- */
- public boolean contains(Class cls, Object primaryKey);
- /**
- * Remove the data for the given entity from the cache.
- */
- public void evict(Class cls, Object primaryKey);
- /**
- * Remove the data for entities of the specified class (and its
- * subclasses) from the cache.
- */
- public void evict(Class cls);
- /**
- * Clear the cache.
- */
- public void evictAll();
- }
JPA的2.0緩存API還提供了允許您刷新或繞過使用查詢提示,兩個(gè)實(shí)例:CacheRetrieveMode和CacheStoreMode定義緩存。您使用CacheRetrieveMode讀取緩存數(shù)據(jù):
- javax.persistence.cache.retrieveMode: CacheRetrieveMode
繞過緩存,您將直接從數(shù)據(jù)庫(kù)中獲取數(shù)據(jù)。
您使用CacheStoreMode插入或更新到緩存中,在讀取數(shù)據(jù)時(shí)從數(shù)據(jù)庫(kù)中調(diào)取實(shí)體數(shù)據(jù),如下:
- javax.persistence.cache.storeMode: CacheStoreMode
當(dāng)CacheStoreMode不會(huì)強(qiáng)制一個(gè)已經(jīng)緩存的項(xiàng)目時(shí),從數(shù)據(jù)庫(kù)中讀取刷新的數(shù)據(jù)。
在刷新、插入或更新到緩存讀取數(shù)據(jù)時(shí),將強(qiáng)制從數(shù)據(jù)庫(kù)中讀取項(xiàng)目緩存的刷新。
當(dāng)二級(jí)緩存被啟用,***次提取持久性提供的程序?qū)ふ以诔志没瘜?duì)象的實(shí)體。如果它不容易找到他們,而不是發(fā)送查詢到數(shù)據(jù)庫(kù)緩存中。
這里是JPA的二級(jí)緩存優(yōu)點(diǎn)和缺點(diǎn):
優(yōu)點(diǎn):
◆避免了已經(jīng)加載對(duì)象的數(shù)據(jù)庫(kù)訪問
◆對(duì)于頻繁訪問的未修改的對(duì)象讀取更快
缺點(diǎn):
◆內(nèi)存消耗大量的對(duì)象
◆更新陳舊的數(shù)據(jù)對(duì)象
◆需要對(duì)可擴(kuò)展性差的對(duì)象進(jìn)行頻繁更新
◆增加并發(fā)代碼拼寫
二級(jí)緩存***是經(jīng)常閱讀經(jīng)常修改的數(shù)據(jù),而不是至關(guān)重要的。
原文名稱:JPA 2.0 Cache Vs. Hibernate Cache: Differences in Approach
原文地址:http://www.developer.com/java/
原文作者:Sangeetha S Nitin KL
【51CTO譯稿,非經(jīng)授權(quán)謝絕轉(zhuǎn)載,合作媒體轉(zhuǎn)載請(qǐng)注明原文出處、作者及51CTO譯稿和譯者!】
【編輯推薦】
- JPA 2.0 Vs Hibernate:緩存方法的差異(二)
- JPA與Hibernate的優(yōu)缺點(diǎn)
- JPA重整ORM山河
- 淺析Hibernate EntityManager
- 講解Hibernate核心API
- 簡(jiǎn)述Hibernate ORM是什么