首页 > 其他分享 >JPA中利用二级缓存优化访问性能(转载)

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

时间:2023-03-28 14:05:41浏览次数:52  
标签:缓存 OpenJPA JPA 实体 二级缓存 转载 public


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 和类的两个被管理的实体,返回的是同一个实例
 

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



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



    1. public class
    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
    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"/>

    标签:缓存,OpenJPA,JPA,实体,二级缓存,转载,public
    From: https://blog.51cto.com/u_2650279/6154713

    相关文章

    • 转载:asan 使用
      https://blog.csdn.net/u013171226/article/details/126876335https://www.osc.edu/resources/getting_started/howto/howto_use_address_sanitizer1.makecflagsstati......
    • JPA的一对多映射(单向)
       JPA的一对多映射(单向)Postedon  CN.programmer.Luxh 注意:这里说的是一对多的单向关联,不是一对多的双向关联。实体Author:作者。实体Book:作者写的......
    • jpa修改操作执行完了,也没报错,但是数据没有进行修改
      查询操作正常、修改就不生效看一下是不是重新创建了一个新的事务、导致数据更新了没有进行事务提交@Primary@Bean(name=TRANSACTION_MANAGER_NAME)public......
    • [软件工程]代码调试方法 : 小黄鸭调试法 [转载]
      小黄鸭调试法(又称橡皮鸭调试法,黄鸭除虫法)是软件工程中使用的调试代码方法之一。此概念是参照于一个来自《程序员修炼之道》书中的一个故事。传说中程序编程大师......
    • [软件设计] 软件系统总体结构设计 | 软件架构概述 [转载]
      1概述对于程序员而言,开始关注架构就是重大进步。就已经从单纯写代码的层次里跳了出来,至少从“增删改查”中跳了出来,能以更宏观的视角去思考代码、思考软件工程!这是一个......
    • modbus CRC校验源码转载
       c#CRC校验 用于学习记录原文载自:https://www.cnblogs.com/ayxj/p/11481969.html用C#实现的几种常用数据校验方法整理(CRC校验;LRC校验;BCC校验;累加和校验)   ......
    • java——Zookeeper学习——zk概览转载
      一、ZooKeeper简介ZooKeeper是一个分布式协调服务,提供了诸如数据发布/订阅、负载均衡、命名服务、分布式协调/通知和分布式锁等分布式基础服务。1.1、数据结构ZooKeeper......
    • CSS鼠标样式(cursor)总结(转载)
      CSS鼠标样式(cursor)总结 属性值示意图描述auto 默认值,由浏览器根据当前上下文确定要显示的光标样式default默认光标,不考虑上下文,通常是一个箭头none......
    • 【JPA】@Modifying 注解
      工作中看到JPA中有一个@Modifying的用法,故此记录一下JDK1.8Springboot2JPAOracle 之前一直用的是这样的写法:StringupdateQuery="UPDATEuserSETname=:name......
    • Markdown语法说明及测试一览表(转载)
      Markdown目录在文中放置[toc]Markdown标题在标题前放置1~6个#号一级标题二级标题三级标题四级标题五级标题六级标题Markdown段落格式常用通用部分......