JPA中利用二级缓存优化访问性能(转载)

转载 2013年12月05日 17:39:37

JPA使用也有好几年了,但是一直都没有对其中的缓存机制使用,我们知道在JPA2.0以后,作为JAVA6的标准,JPA2.0增加了对二级缓存的支持,比如中间件websphere、weblogic、JBOSS等也都相应提供了对OpenJPA2.0以及JPA二级缓存的支持,OpenJPA的缓存机制要比其他的ORM框架自带的缓存要强大的多,其他的ORM框架如hibernate自带的缓存Session级别的,如果你想实现跨Session的缓存就必须集成第三方的缓存(Terracotta、Ehcache、oscache等), 但OpenJPA的缓存是能够跨Session的,对应JPA的标准来说就是跨entityManager,是EntityManagerFactory级别的。OpenJPA的缓存还能够支持多JVM,也就是能够在分布式的环境中使用(这点和terracotta相似)。

JPA中一级缓存(JPA2.0之前的版本)
持久化上下文其实就是JPA的一级缓存,通过在持久化上下文中存储持久化状态实体的快照,既可以进行检测,还可以当做持久化实体的缓存。一级缓存属于请求范围级别的缓存。

如下图:

持久化上下文好比一个数据库,实体管理器好比一张表,需要保证在持久化上下文中。
实体好比表中一条记录,每一个实体管理器都对应若干个实体。
但不同的是,同一实体又可以被多个实体管理器管理,所以在一级缓存的范围内,需要借助乐观锁或悲观锁来保证实体操作的正常执行。
我们可以从下面的部分代码可以得出,同一个持久化上下文中,具有相同 ID 和类的两个被管理的实体,返回的是同一个实例

 

Java代码  收藏代码
  1. @Stateless   
  2. public ContextManagerBean implements IContextManagerBean {   
  3. @PersistenceContext EntityManager entityManager;   
  4. public void createEnBean() {   
  5.    EnBean enBean = new EnBean (0001"yale");   
  6.    entityManager.persist(enBean);  //被实体管理器管理   
  7.     EnBean enBean1 =entityManager.find(EnBean, enBean.getId())); 被另一个实体管理器管理   
  8.     if(enBean == enBean1) // 这里是相等的   
  9.     System.out.println("验证结果输出");   
  10.  }   
  11.   
  12. }   

 
 JPA中二级缓存(JPA2.0之后的版本)
 JPA二级缓存是跨持久化上下文共享实体状态的,是真正意义上的全局应用缓存。如果二级缓存激活,JPA会先从一级缓存寻找实体,未找到再从二级缓存中寻找。JPA 2.0 规范提供一些基本缓存操作的API,可以在EntityManagerFactory 中使用,JPA2.0提供的新API :

Java代码  收藏代码
  1.  public class Cache {   
  2. // 检查对象是否在 Map 中  
  3. public Boolean contains(Class class, Object pk);   
  4. // 失效 Map 中的对象  
  5. public void evict(Class class, Object pk)   
  6. // 失效 Map 中的类  
  7. public void evict(Class class)   
  8. // 失效所有在 Map 中的类  
  9. public void evictAll();   
  10. }   

 

 如下图:


 
OpenJPA缓存有两种:
DataCache--->用来缓存EntityManagerFactory级别的持久化实体的。当启用DataCache后,OpenJPA会先检查DataCache,
如果实体不存在再从存储介质中读取。相关配置文件内存容添加到persistence.xml中:
 <property name="openjpa.DataCache" value="true(CacheSize=5000, SoftReferenceSize=0)" /> 
 <property name="openjpa.RemoteCommitProvider" value="sjvm" /> 
 同其他缓存技术需要管理的属性相似,可能在缓存管理的算法上有所区别,OpenJPA中中属性管理如下:
 CacheSize:指的是缓存实体的最大数目,默认CacheSize是1000,如果缓存实体超出这一数值时,OpenJPA会随机逐出一些实体,直至实体数目小于设定的最大数目。
 SoftReferenceSize:指OpenJPA的缓存如果达到最大存储数目,或根据一定的算法需要从缓存中移出一下数据时,会把它们放到一个softReferenceMap中,softReferenceMap
 中的数据也会删除只是这些数据比直接删除会待的时间久一些,以防止在缓存删除他们以后程序马上又需要访问他们,这样下次访问到这些移出的数据时就会到softReferenceMap中去找,这样比直接删除和重新访问数据库查找的效率好一点(这点跟其他的缓存实现有点不一样,其它的缓存是直接从缓存中删除这些数据),如果你不想使用sofeReferenceMap, 就把它的值设成0。
 
QueryCache--->用来缓存查询语句返回的结果
<property name="openjpa.QueryCache" value="CacheSize=1000, SoftReferenceSize=100"/>

JPA面试常见问题

这篇文章是摘自Patrick Linskey的一篇文章,主要是关于JPA相关内容的问答,相信JPA面试会碰到很多这里面的问题问题:EJB专家团队是如何摆脱事务描述符的?回答:在会话bean和消息驱动b...
  • hahalzb
  • hahalzb
  • 2010年11月02日 23:55
  • 2388

jpa hibernate的三种缓存机制

缓存是介于应用程序和物理数据源之间,其作用是为了降低应用程序对物理数据源访问的频次,从而提高了应用的运行性能。缓存内的数据是对物理数据源中的数据的复制,应用程序在运行时从缓存读写数据,在特定的时刻或事...
  • petercnmei
  • petercnmei
  • 2017年02月09日 10:59
  • 927

面试相关

软件研发人员考核的十项基本原则   ◆要体现公司的价值观   公司的价值观体现了公司认可什么类型的人员?要挽留哪些人?提倡做什么?对这些人员的认可可以通过具体的考核办法落实下来。比如企业鼓励在某一个...
  • lovenmg
  • lovenmg
  • 2010年08月02日 11:09
  • 578

JPA学习笔记(11)——使用二级缓存

一级缓存查询两次id为1的userUser user1 = entityManager.find(User.class, 1); User user2 = entityManager.find(Use...
  • u010837612
  • u010837612
  • 2015年08月20日 16:13
  • 2556

spring data jpa使用二级缓存

在用spring data jpa的过程中,采用了ehcache 来做缓存, 是否需要二级缓存,一般不需要,这得看业务的需要,因为这东西如果配置不好,反而会导致性能下降,但如果是有些数据,基本不改动,...
  • qq_20545159
  • qq_20545159
  • 2015年09月18日 15:53
  • 3724

jpa的一级和二级缓存

jpa的一级和二级缓存 一级缓存:比如: Customer customer1 = entityManager.find(Customer.class, 1); Customer custome...
  • petercnmei
  • petercnmei
  • 2017年02月09日 09:29
  • 862

ehCache基于JPA的二级缓存的使用

1. 下载ehcache的相关jar文件并放置到Java Web工程的WebRoot/WEB-INF/lib目录下;   2. 编辑JPA配置文件 persistence.xml:  ...
  • zhangxtn
  • zhangxtn
  • 2015年10月29日 09:42
  • 1029

JPA学习笔记 - 使用二级缓存

1、引包:hibernate-ehcache, ehcache,  2、引入hibernate的project/etc/ehcache.xml 3、配置二级缓存相关信息 4、配...
  • a258831020
  • a258831020
  • 2015年12月27日 22:55
  • 527

Spring Data Jpa 缓存

JPA仅仅只是一个规范,而不是产品;使用JPA本身是不能做到持久化的。所以,JPA只是一系列定义好的持久化操作的接口,在系统中使用时,需要真正的实现者,在这里,我们使用Hibernate作为实现者。 ...
  • chenjianandiyi
  • chenjianandiyi
  • 2016年08月20日 15:49
  • 4182

[JavaEE - JPA] 性能优化: 如何定位性能问题

要想解决性能问题,首先得要有办法定位问题。而JPA的性能问题,可以说99%都是因为JPA Provider(一般使用的都是Hibernate,或者EclipseLink)生成的SQL效率低下或者生成并...
  • dm_vincent
  • dm_vincent
  • 2016年12月03日 19:26
  • 3872
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:JPA中利用二级缓存优化访问性能(转载)
举报原因:
原因补充:

(最多只允许输入30个字)