JPA 二级缓存是跨持久化上下文共享实体状态的,是真正意义上的全局应用缓存。如果二级缓存激活,JPA 会先从一级缓存寻找实体,未找到再从二级缓存中寻找
当二级缓存有效时,你就不能依靠事务来保护并发数据的,而是依靠锁策略:
- 在确认修改后,需要手工处理乐观锁失败
- 配置失效期,以及刷新策略,最小化使用锁策略
二级高速缓存通常是用来提高性能。但是,使用缓存可能会导致提取“陈旧”数据,表 1 展示了 JPA 的二级缓存优点和缺点:
表 1. JPA 的二级缓存优点和缺点
所以二级缓存最好是用在经常阅读经常和修改的数据,而不是至关重要的数据。
@Test
public void testjpaSecondLevelCache() {String jpql="from Department d";
EntityManager manager=entityManagerFactory.createEntityManager();
Query query=manager.createQuery(jpql);
List<Department> list=query.setHint(org.hibernate.ejb.QueryHints.HINT_CACHEABLE,true).getResultList();
manager.close();
manager=entityManagerFactory.createEntityManager();
query=manager.createQuery(jpql);
list=query.setHint(org.hibernate.ejb.QueryHints.HINT_CACHEABLE,true).getResultList();
manager.close();
}
---------------------------------------------------
@QueryHints({@QueryHint(name=org.hibernate.ejb.QueryHints.HINT_CACHEABLE,value="true")})
@Query("from Department d")
List<Department> getAll();
@Test
public void testRepositorySecondLevelCache() {
List<Department> list=departmentRepository.getAll();
list=departmentRepository.getAll();
}