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 和类的两个被管理的实体,返回的是同一个实例
@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 :
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"/>
分享到:
相关推荐
**正文** 在Java持久化领域,Java Persistence API (JPA) 是一种标准接口,用于管理和存储对象到数据库。...正确地利用二级缓存,将大大提高系统的响应速度,降低数据库压力,为用户带来更好的体验。
4. 实现二级缓存的策略:在Java代码中,需要正确地配置实体类和存储库接口来利用二级缓存。这通常包括为实体类设置正确的缓存策略,以及在存储库接口中使用缓存相关的注解和方法。 5. 引导类配置:可以通过@...
12. **实施二级缓存**:实现一个分布式二级缓存,以减少对数据库的访问次数,提高响应速度。 ### 总结 性能优化不是非黑即白的事情,很多时候需要通过试验和错误来找到最佳实践。以上提到的策略并非仅适用于JPA,...
通过学习这个实例,你可以了解到如何在项目中设置和利用Hibernate的二级缓存,从而提升应用的性能。 总结来说,Hibernate的二级缓存是提高系统效率的关键,它通过存储和重用已经加载的数据,降低了数据库的访问频率...
- **缓存机制**:JPA支持一级缓存(内置缓存)和二级缓存(可选的第三方缓存实现)。这有助于减少数据库访问次数,提高应用性能。 - **批量操作**:JPA 2.0增加了对批量操作的支持,允许一次性执行多条更新或删除...
1. **缓存机制**: 利用Hibernate的二级缓存或者查询缓存,提高数据读取效率。 2. **懒加载与立即加载**: 懒加载可以减少不必要的数据获取,而立即加载则可以在查询时一并获取关联数据。 3. **批处理**: 对于批量...
1. **性能优化**:Hibernate提供了缓存机制,如一级缓存(Session级)和二级缓存(SessionFactory级),以减少对数据库的访问。 2. **更丰富的查询功能**:除了JPQL,Hibernate还支持HQL(Hibernate Query Language...
9. **二级缓存(Second-Level Cache)**:探讨如何利用JPA的二级缓存提高应用程序的性能。 10. **实体监听器(Entity Listeners)**:学习如何使用实体监听器来执行特定的业务逻辑,如在插入、更新或删除时触发某些...
例如,二级缓存可以减少数据库访问,而批处理可以减少网络通信。 综上所述,这个"jpa环境jar包"集合为开发者提供了构建JPA应用所需的一切工具,涵盖了从基本的JPA接口到具体ORM实现、数据库连接、事务管理、查询...
4. **缓存机制**:OpenJPA提供了本地缓存和第二级缓存功能,以提高数据访问性能。本地缓存存储了最近访问过的实体,而第二级缓存则可以在多个数据源之间共享数据,减少对数据库的访问。 5. **元数据源**:OpenJPA...
- 缓存:利用Hibernate的二级缓存,提高数据读取速度。 10. **DengDemo项目** 提到的"DengDemo"可能是示例项目的名字,这个项目可能包含了整合SpringBoot和JPA的实例代码,包括实体类、Repository接口、配置文件...
Spring JPA是Spring框架...通过对Spring JPA的源代码分析,我们可以深入了解其内部机制,更好地利用其特性,优化数据访问性能,并实现高效且易于维护的业务逻辑。同时,了解源码也有助于我们遇到问题时进行调试和解决。
8. **缓存机制**: JPA支持一级缓存(Persistence Context)和二级缓存(可选,如Hibernate的第二级缓存),提高数据访问效率。 ### JPA设计模式 1. **单一责任原则(SRP)**: 每个实体类只关注其业务逻辑,数据库...
Hibernate不仅实现了JPA规范,还额外提供了一些特性,如二级缓存、更灵活的查询选项和性能优化工具。 **JPA核心概念:** 1. **实体(Entity)**:在JPA中,实体是映射到数据库表的Java类。通过在类上添加`@Entity`...
二级缓存允许频繁访问的数据在内存中被缓存,减少了对数据库的直接访问,从而提升了应用程序的性能。 最后,"jpaweb"可能指的是项目的Web层,它展示了如何将这些框架整合到一个Web应用中,可能使用了如Spring MVC...
要注意JPA的一些性能优化技巧,如懒加载(Lazy Loading)、批处理(Batch Processing)、缓存机制(一级缓存和二级缓存)等,以提升应用程序的性能。 通过以上步骤,我们就可以在Spring项目中有效地整合JPA,实现...
Spring Data JPA利用Spring的事务管理能力,通过@Transactional注解在方法级别控制事务。这使得开发者能够轻松地处理事务,确保数据的一致性。 六、JPA规范 Spring Data JPA遵循JPA规范,这意味着它可以与其他JPA...
5. **缓存机制**:提供了本地和第二级缓存,以提高性能并减少对数据库的访问。 6. **生命周期事件**:支持实体对象的生命周期回调方法,如pre-persist、post-load等,方便开发者在特定阶段执行自定义逻辑。 7. **...
- **第一级缓存与第二级缓存**: 持久化上下文作为第一级缓存,可减少对数据库的访问;而第二级缓存则跨会话共享数据,提高效率。 - **批处理**: 使用`setFlushMode(FlushModeType.COMMIT)`和`setFetchSize(int ...
- JPA允许使用二级缓存来提高性能,通过缓存策略,可以减少对数据库的访问,提高系统响应速度。 5. **实体生命周期** - 新建(New):对象刚刚被创建,还没有被持久化。 - 临时(Transient):对象已实例化,但...