JPA Cache缓存

这篇博客详细介绍了Hibernate的一级和二级缓存机制。一级缓存由Session提供,随Session生命周期存在,关闭Session时清空。二级缓存配置涉及开启缓存、选择缓存提供商、指定缓存策略,并在实体类上进行缓存配置。文章讲解了不同缓存策略,如只读、读写、非严格读写,并提供了配置示例。
摘要由CSDN通过智能技术生成
               

先了解一下cache基础:

一级缓存

Hibernate 的一级缓存是由 Session 提供的,因此它只存在于 Session 的生命周期中,当程序调用 save(),update(),saveorupdate() 等方法 及调用查询接口 list,filter,iterate 时,如 session 缓存中还不存在相应的对象, Hibernate 会把该对象加入到一级缓存中,
当 Session 关闭的时候该 Session 所管理的一级缓存也会立即被清除
Hibernate 的一级缓存是 Session 所内置的,不能被卸载,也不能进行任何配置
 
二级缓存配置:    
  
1 、首先要打开二级缓存,在 hibernate.cfg.xml 中添加如下配置:    
<property name="hibernate.cache.use_second_level_cache">true</property>  
  
2 、 Hibernate 的二级缓存使用第三方的缓存工具来实现,所以我们需要指定 Hibernate 使用哪个    
   缓存工具。如下配置指定 Hibernate 使用 EhCache 缓存工具。    
<property name="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</property>  
  
3 、 Hibernate 在默认情况下并不会对所有实体对象进行缓存,所以,我们需要指定缓存哪些对象,    
在实体对象的映射文件中(相应的 <class> 标签内部),添加如下配置:    
<cache usage="read-only"/>  
  
usage="read-only" 是“只读”缓存策略。    
  
注意,这个 <cache> 标签只能放在 <class> 标签的内部,而且必须处在 <id> 标签的前面!!!    
这个 <cache> 标签放在哪些 <class> 标签下面,就说明会多这些类的对象进行缓存    
  
4 、对于第 3 步,有一个可选的方案是在 hibernate.cfg.xml 文件中指定哪些类的对象需要缓存,    
   而不需要使用 <cache> 标签来指定。如:    
   在 hibernate.cfg.xml 中添加如下配置:    
   <class-cache class="com.bjsxt.hibernate.Classes" usage="read-only" />  
     
   注意,这个 <class-cache> 标签必须放在 <mapping> 标签的后面!!    
 
Hibernate缓存配置
_____________________________________________________________________________________
Hibernate的缓存分为:
  一级缓存:在Session级别的,在Session关闭的时候,一级缓存就失效了。
  二级缓存:在SessionFactory级别的,它可以使用不同的缓存实现,如EhCache 、JBossCache、OsCache等。
  
缓存的注释写法如下,加在Entity的java类上:
  @Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
  
缓存的方式有四种,分别为:
  CacheConcurrencyStrategy.NONE
  CacheConcurrencyStrategy.READ_ONLY,只读模式,在此模式下,如果对数据进行更新操作,会有异常;
  CacheConcurrencyStrategy.READ_WRITE,读写模式在更新缓存的时候会把缓存里面的数据换成一个锁,其它事务如果去取相应的缓存数据,发现被锁了,直接就去数据库查询;
  CacheConcurrencyStrategy.NONSTRICT_READ_WRITE,不严格的读写模式则不会的缓存数据加锁;
  CacheConcurrencyStrategy.TRANSACTIONAL,事务模式指缓存支持事务,当事务回滚时,缓存也能回滚,只支持JTA环境。
  
另外还有如下注意事项:
  1、查询缓存需要在Query的相应方法执行前加上这么一句:
  query.setCacheable(true);
  在使用Hibernate时,获得的query有setCacheable 方法,可以设置使用缓存,但当使用JPA时,javax.persistence.Query并没有setCacheable方法,此时如果JPA的实现是Hibernate时,可以将其进行如下转化,再调用setCacheable方法(如果JPA的实现是其它ORMAP框架,就不知道怎么做了)。
if (query instanceof org.hibernate.ejb.QueryImpl) {
    ((org.hibernate.ejb.QueryImpl) query).getHibernateQuery().setCacheable(true);
}
  2、还有就是查询缓存的查询执行后,会将查询结果放入二级缓存中,但是放入的形式是以ID为Key,实例作为一个Value。
  3、hibernate的配置文件中需加入如下信息:
<property name="hibernate.cache.provider_class" value="org.hibernate.cache.EhCacheProvider" 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值