`
wbj0110
  • 浏览: 1610818 次
  • 性别: Icon_minigender_1
  • 来自: 上海
文章分类
社区版块
存档分类
最新评论

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

阅读更多

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"/>

分享到:
评论

相关推荐

    springboot+jpa(hibernate配置redis为二级缓存) springboot2.1.4

    二级缓存是ORM框架(如Hibernate)中的一个重要特性,它可以在数据库和应用程序之间存储经常访问的数据,以减少对数据库的直接访问,从而提高性能。通常,一级缓存由Hibernate Session管理,而二级缓存则可以跨越多...

    JPA-5 使用二级缓存

    而当我们谈论“JPA-5 使用二级缓存”时,我们是在讨论如何利用JPA的一个高级特性,即二级缓存,来提升应用的性能。 一级缓存是每个EntityManager实例内的缓存,它是默认开启的,并且是事务性的。一级缓存存储了在...

    spring-boot-starter-data-jpa 的二级缓存

    总之,Spring Boot通过starter-data-jpa模块和Hibernate、Ehcache整合,为我们提供了一个强大的工具集,可以有效地实现二级缓存机制,优化应用性能,减少数据库压力。开发者需要掌握这些知识点,以确保在实际的项目...

    jpa性能优化ppt

    12. **实施二级缓存**:实现一个分布式二级缓存,以减少对数据库的访问次数,提高响应速度。 ### 总结 性能优化不是非黑即白的事情,很多时候需要通过试验和错误来找到最佳实践。以上提到的策略并非仅适用于JPA,...

    spring + ehcache + redis两级缓存

    当我们谈论“Spring + Ehcache + Redis”两级缓存时,我们实际上是在讨论如何在Java环境中利用Spring框架来集成Ehcache作为本地缓存,并利用Redis作为分布式二级缓存,构建一个高效且可扩展的缓存解决方案。...

    Hibernate二级缓存+分页功能

    在Java的持久化框架Hibernate中,二级缓存和分页功能是两个重要的优化手段,能够显著提升应用程序的性能和用户体验。下面将详细讲解这两个概念及其实际应用。 **一、Hibernate二级缓存** Hibernate一级缓存是指...

    Hibernate二级缓存实例.rar

    通过学习这个实例,你可以了解到如何在项目中设置和利用Hibernate的二级缓存,从而提升应用的性能。 总结来说,Hibernate的二级缓存是提高系统效率的关键,它通过存储和重用已经加载的数据,降低了数据库的访问频率...

    jpa二级缓存设置专业资料[汇编].pdf

    jpa二级缓存设置专业资料[汇编].pdf

    Hibernate二级缓存的应用

    总之,理解并熟练运用Hibernate的二级缓存,对于优化Java EE应用的性能至关重要。正确配置和管理缓存,可以显著提升系统响应速度,同时降低数据库的维护成本。在实际项目中,根据业务场景选择合适的缓存策略,才能...

    springmvc4+spring4+hibernate5.1.3+二级缓存ehcache+fastjson配置

    在本配置中,Hibernate版本为5.1.3,支持JPA规范,提供了二级缓存功能,提高了数据访问性能。 4. **二级缓存(Ehcache)**: Ehcache是Hibernate的一个可选二级缓存插件,用于存储数据库查询结果,减少对数据库的...

    spring data jpa中文文档

    Hibernate提供了丰富的功能,如缓存、二级缓存、懒加载等,但也需要考虑其性能和内存使用。 8. **Specifications** 对于更复杂的查询需求,Spring Data JPA提供了Specification接口,可以构建可组合的查询条件,以...

    Pro JPA2 精通JPA2

    4. **缓存机制**:JPA提供了一级缓存和二级缓存,分别用于缓存实体对象和查询结果,提高应用程序的性能。 5. **事件监听器**:允许在实体生命周期的特定点触发自定义代码,例如,在实体保存前进行预处理或在实体删除...

    Spring Data JPA中文文档[1.4.3]_springdatajpa_erlang_waitxpf_

    **Spring Data JPA** 是一个基于 **Java** 的开源...文档中可能还会涵盖错误处理、性能优化以及与其他 Spring 模块的协作等内容。在学习过程中,结合实际编程实践,能更好地理解和掌握 Spring Data JPA 的强大功能。

    Spring Data JPA中文文档[1.4.3].zip

    12. **性能优化**:包括缓存策略、批处理更新和读取、懒加载等提高性能的方法。 13. **最佳实践**:了解在实际项目中使用Spring Data JPA时的一些推荐做法,避免常见的陷阱和问题。 14. **扩展和自定义**:如果...

    JPA2.0高级教程

    - **一级缓存与二级缓存**:JPA提供了一级缓存(持久化上下文)和二级缓存(可选),用于存储实体及其状态,减少数据库访问次数。 - **批处理**:批量执行数据库操作可以显著提高应用性能。 ##### 3.3 安全性和事务...

    JPA中文解释,JPA的API

    8. 性能优化技巧,如批处理、懒加载和缓存策略。 总之,JPA是Java开发中处理数据库的强大工具,通过学习和掌握其API和注解的使用,开发者可以更加高效地进行数据持久化操作,同时减少对底层数据库知识的依赖。结合...

    jpa例子jpajpa

    5. **事务管理(Transaction)**: 在JPA中,事务是通过`EntityManager`进行管理的。你可以使用`begin()`, `commit()`和`rollback()`方法来控制事务的边界。 6. **懒加载(Lazy Loading)与即时加载(Eager Loading...

    JPA Specification

    - **缓存机制**:JPA支持一级缓存(内置缓存)和二级缓存(可选的第三方缓存实现)。这有助于减少数据库访问次数,提高应用性能。 - **批量操作**:JPA 2.0增加了对批量操作的支持,允许一次性执行多条更新或删除...

    JPA教程JPA教程JPA教程

    在性能优化方面,JPA提供了缓存机制,包括一级缓存(由EntityManager实例维护)和二级缓存(可选,由缓存提供者如Hibernate的SecondLevelCache实现)。缓存能够提高数据读取速度,减少对数据库的访问次数。另外,JPA...

    DataNucleus JPA/JDO访问mysql示例

    6. **性能优化**:学习如何利用DataNucleus的缓存机制和优化选项提高数据访问性能。 7. **迁移和版本控制**:理解如何在数据库版本升级时使用DataNucleus的迁移工具。 在实践中,这些示例将帮助你更好地理解...

Global site tag (gtag.js) - Google Analytics