JPA中利用二级缓存优化访问性能(转载)
2013-12-05 17:39
591 查看
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代码
@Stateless
public ContextManagerBean implements IContextManagerBean {
@PersistenceContext EntityManager entityManager;
public void createEnBean() {
EnBean enBean = new EnBean (0001, "yale");
entityManager.persist(enBean); //被实体管理器管理
EnBean enBean1 =entityManager.find(EnBean, enBean.getId())); 被另一个实体管理器管理
if(enBean == enBean1) // 这里是相等的
System.out.println("验证结果输出");
}
}
JPA中二级缓存(JPA2.0之后的版本)
JPA二级缓存是跨持久化上下文共享实体状态的,是真正意义上的全局应用缓存。如果二级缓存激活,JPA会先从一级缓存寻找实体,未找到再从二级缓存中寻找。JPA 2.0 规范提供一些基本缓存操作的API,可以在EntityManagerFactory 中使用,JPA2.0提供的新API :
Java代码
public class Cache {
// 检查对象是否在 Map 中
public Boolean contains(Class class, Object pk);
// 失效 Map 中的对象
public void evict(Class class, Object pk)
// 失效 Map 中的类
public void evict(Class class)
// 失效所有在 Map 中的类
public void evictAll();
}
如下图:
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的缓存是能够跨Session的,对应JPA的标准来说就是跨entityManager,是EntityManagerFactory级别的。OpenJPA的缓存还能够支持多JVM,也就是能够在分布式的环境中使用(这点和terracotta相似)。
JPA中一级缓存(JPA2.0之前的版本)
持久化上下文其实就是JPA的一级缓存,通过在持久化上下文中存储持久化状态实体的快照,既可以进行检测,还可以当做持久化实体的缓存。一级缓存属于请求范围级别的缓存。
如下图:
持久化上下文好比一个数据库,实体管理器好比一张表,需要保证在持久化上下文中。
实体好比表中一条记录,每一个实体管理器都对应若干个实体。
但不同的是,同一实体又可以被多个实体管理器管理,所以在一级缓存的范围内,需要借助乐观锁或悲观锁来保证实体操作的正常执行。
我们可以从下面的部分代码可以得出,同一个持久化上下文中,具有相同 ID 和类的两个被管理的实体,返回的是同一个实例
Java代码
@Stateless
public ContextManagerBean implements IContextManagerBean {
@PersistenceContext EntityManager entityManager;
public void createEnBean() {
EnBean enBean = new EnBean (0001, "yale");
entityManager.persist(enBean); //被实体管理器管理
EnBean enBean1 =entityManager.find(EnBean, enBean.getId())); 被另一个实体管理器管理
if(enBean == enBean1) // 这里是相等的
System.out.println("验证结果输出");
}
}
JPA中二级缓存(JPA2.0之后的版本)
JPA二级缓存是跨持久化上下文共享实体状态的,是真正意义上的全局应用缓存。如果二级缓存激活,JPA会先从一级缓存寻找实体,未找到再从二级缓存中寻找。JPA 2.0 规范提供一些基本缓存操作的API,可以在EntityManagerFactory 中使用,JPA2.0提供的新API :
Java代码
public class Cache {
// 检查对象是否在 Map 中
public Boolean contains(Class class, Object pk);
// 失效 Map 中的对象
public void evict(Class class, Object pk)
// 失效 Map 中的类
public void evict(Class class)
// 失效所有在 Map 中的类
public void evictAll();
}
如下图:
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"/>
相关文章推荐
- 性能优化(一)Hibernate 利用缓存(一级、二级、查询)提高系统性能
- 利用 JPA 2.0 二级缓存实现高速数据访问
- 使用OSCache优化性能,及JPA二级缓存
- 性能优化(一)Hibernate 利用缓存(一级、二级、查询)提高系统性能
- 利用数据缓存机制提高智能设备应用程序的数据访问性能
- 【Hibernate框架开发之九】Hibernate 性能优化笔记!(遍历、一级/二级/查询/缓存、乐观悲观锁等优化算法)
- 性能优化(一)Hibernate 利用缓存(一级、二级、查询)提高系统性能
- 【Hibernate框架开发之九】Hibernate 性能优化笔记!(遍历、一级/二级/查询/缓存、乐观悲观锁等优化算法)
- 利用数据缓存机制提高智能设备应用程序的数据访问性能
- 浅谈利用缓存来优化HTML5 Canvas程序的性能
- 如何利用客户端缓存对网站进行优化[转载]
- 数据访问优化性能(转载)
- 如何利用Nginx的缓冲、缓存优化提升性能
- JAVAWEB开发之Hibernate详解(三)——Hibernate的检索方式、抓取策略以及利用二级缓存进行优化、解决数据库事务并发问题
- 利用convertView优化ListView性能(转载)
- Hibernate 性能优化之二级缓存
- 网站性能优化:页面静态化和二级缓存
- H5 缓存机制浅析 - 移动端 Web 加载性能优化【转载保留】
- [转载]Android利用convertView优化ListView性能
- 转载 优化网站性能 提高网站速度访问速度的14条实践