自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

JPA 2.0 Vs Hibernate:緩存方法的差異(一)

原創(chuàng)
開發(fā) 后端
JPA 2.0 Vs Hibernate:緩存方法的差異,本文為developer.com的Java頻道7月12日的頭條新聞的第一部分:為我們講述JPA 2.0(Java Persistence API)的緩存方法。

【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è)例子:

  1. @Stateless  
  2. public EmpDetailsBean implements EmpDetails {  
  3. @PersistenceContext  
  4. EntityManager entityManager;  
  5.  
  6. public Employee addEmployee(String empId, String empName, String empUni) {  
  7. Employee employee = new Employee(empId, empName, empUnit);  
  8. entityManager.persist(employee); //employee is managed entity  
  9. return employee; //employee is detached entity  
  10. }  
  11.  
  12. public Employee updateEmployee(Employee employee) {  
  13. //employee is detached entity, employee1 is managed entity  
  14. Employee employee1 = entityManager.merge(employee);  
  15. return employee;  
  16. }  
  17. }  
  18.  

擴(kuò)大一下范圍,在多個(gè)持久化對(duì)象之間來回調(diào)用,因此對(duì)實(shí)體集并不是脫離,他們依然管理。擴(kuò)展的范圍適合應(yīng)用場(chǎng)合在用戶跨越多個(gè)請(qǐng)求。

下面是一個(gè)擴(kuò)大范圍的例子:

  1. @Stateful  
  2. public EmpDetailsBean implements EmpDetails {  
  3. @PersistenceContext(type=PersistenceContextType.EXTENDED)  
  4. EntityManager entityManager;  
  5. //Cached employee  
  6. private Employee employee;  
  7.  
  8. public void addEmployee(String empId, String empName, String empUnit) {  
  9. employee = new Employee(empId, empName, empUnit);  
  10. entityManager.persist(employee); //employee is managed entity  
  11. }  
  12.  
  13. public void updateEmployee(String empUnit) {  
  14. employee.setUnit(empUnit); //employee is managed entity  
  15. }  
  16. }  
  17.  

然而,擴(kuò)大使用范圍,緩存的內(nèi)存消耗需要進(jìn)行評(píng)估,是利用緩存調(diào)用消耗少還是直接訪問數(shù)據(jù)庫(kù)方便。圖1顯示JPA 1級(jí)緩存。

Level1Cache
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í)緩存。

Level2Cache 
JPA Level 2 (L2) Cache

二級(jí)高速緩存通常是用來提高性能。但是,使用緩存可能會(huì)導(dǎo)致提取“陳舊”數(shù)據(jù),因此您可以選擇禁用緩存。

  1. public interface Cache {  
  2. /**  
  3. * Whether the cache contains data for the given entity.  
  4. */  
  5. public boolean contains(Class cls, Object primaryKey);  
  6.  
  7. /**  
  8. * Remove the data for the given entity from the cache.  
  9. */  
  10. public void evict(Class cls, Object primaryKey);  
  11.  
  12. /**  
  13. * Remove the data for entities of the specified class (and its  
  14. * subclasses) from the cache.  
  15. */  
  16. public void evict(Class cls);  
  17.  
  18. /**  
  19. * Clear the cache.  
  20. */  
  21. public void evictAll();  
  22. }  
  23.  

JPA的2.0緩存API還提供了允許您刷新或繞過使用查詢提示,兩個(gè)實(shí)例:CacheRetrieveMode和CacheStoreMode定義緩存。您使用CacheRetrieveMode讀取緩存數(shù)據(jù):

  1. javax.persistence.cache.retrieveMode: CacheRetrieveMode  
  2.  

繞過緩存,您將直接從數(shù)據(jù)庫(kù)中獲取數(shù)據(jù)。

您使用CacheStoreMode插入或更新到緩存中,在讀取數(shù)據(jù)時(shí)從數(shù)據(jù)庫(kù)中調(diào)取實(shí)體數(shù)據(jù),如下:

  1. javax.persistence.cache.storeMode: CacheStoreMode  
  2.  

當(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譯稿和譯者!】

【編輯推薦】

  1. JPA 2.0 Vs Hibernate:緩存方法的差異(二)
  2. JPA與Hibernate的優(yōu)缺點(diǎn)
  3. JPA重整ORM山河
  4. 淺析Hibernate EntityManager
  5. 講解Hibernate核心API
  6. 簡(jiǎn)述Hibernate ORM是什么

 

責(zé)任編輯:佚名 來源: 51CTO獨(dú)家譯文
相關(guān)推薦

2010-07-13 16:20:18

JPA 2.0緩存Hibernate緩存Java EE

2009-06-01 12:11:31

hibernatejpa復(fù)合主鍵

2009-06-17 15:52:23

Hibernate查詢

2009-06-19 18:36:15

JPAHibernate

2021-10-06 23:31:45

HibernateJPASpring Data

2012-02-03 11:31:33

HibernateJava

2009-06-29 08:48:41

Hibernate緩存

2009-09-22 10:50:04

Hibernate c

2009-09-25 16:29:32

Hibernate一級(jí)

2021-07-28 09:00:00

編程語(yǔ)言Kotlin開發(fā)

2009-09-25 10:25:54

Hibernate緩存

2009-09-25 13:51:13

Hibernate S

2009-06-18 14:51:12

Hibernate緩存Hibernate

2009-06-17 15:43:03

Hibernate緩存

2009-09-23 17:03:08

Hibernate S

2009-09-23 09:37:07

Hibernate緩存

2009-06-18 13:42:48

Hibernate s

2009-09-22 11:24:07

Hibernate查詢

2009-06-02 11:25:22

HibernateJPA映射

2009-06-30 14:08:00

Hibernate緩存
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)