对Hibernate一级缓存与二级缓存的解析

  1.  ehcache> 
  2.  

在映射文件中指定缓存同步策略

 
  1. <class name="com.tenly.bean.Student"> 
  2.  
  3.                         <cache usage="read-write"> 
  4.  
  5.                         <set name="classroom"> 
  6.  
  7.                                 <cache usage="read-only"> 
  8.  
  9.                         set> 
  10.  
  11.                 class> 
  12.  

usage属性说明:

◆read-only:只读。对于不会发生改变的数据,可使用只读型缓存。

◆nonstrict-read-write:不严格可读写缓存。如果应用程序对并发访问下的数据同步要求不是很严格的话,而且数据更新操作频率较低。采用本项,可获得良好的性能。

◆read-write 对于经常被读但很少修改的数据,可以采用这种隔离类型,因为它可以防止脏读这类的并发问题.

◆transactional(事物型)在Hibernate中,事务型缓存必须运行在JTA事务环境中。在测试query时,说明其将用二级缓存

 
  1. query.setCacheable(true); 

3、释放缓存:

一级缓存的释放

Session.evict(XXX) 将某个特定的对象从内部缓存中清除,上述的XXX 为对象的实例名。使用此方法有两种适用情形,需要及时释放对象占用的内存维持系统的稳定性是不希望当前Session继续运用此对象的状态变化来同步更新数据库。Session.clear()清除所有的一级缓存

二级缓存的释放

SessionFacatoyr.evict(XXX) 将某个特定的对象从内部缓存中清除,上述的XXX 为对象的实例名。使用此方法有两种适用情形,需要及时释放对象占用的内存维持系统的稳定性是不希望当前Session继续运用此对象的状态变化来同步更新数据库。SessionFactory.clear()清除所有的二级缓存

4、查询缓存:

二级缓存策略的一般过程:

Hibernate进行条件查询的时候,总是发出一条select * from XXX where …(XXX为 表名,类似的语句下文统称Select SQL)这样的SQL语句查询数据库,一次获得所有的符合条件的数据对象。把获得的所有数据对象根据ID放入到第二级缓存中。当Hibernate根据ID访问数据对象的时候,首先从内部缓存中查找,如果在内部缓存中查不到就配置二级缓存,从二级缓存中查;如果还查不到,再查询数据库,把结果按照ID放入到缓存。添加数据、删除、更新操作时,同时更新二级缓存。这就是Hibernate做批处理的时候效率不高的原因,原来是要维护二级缓存消耗大量时间的缘故。

条件查询的处理过程:

第一次查找age>20的所有学生信息,然后纳入二级缓存。第二次我们的查询条件变了,查找age>15的所有学生信息,显然第一次查询的结果完全满足第二次查询的条件,但并不是满足条件的全部数据。这样的话,我们就要再做一次查询得到全部数据才行。如果我们执行的是相同的条件语句,Hibernate引入Query Cache的。

查询缓存策略的一般过程:

完全相同的Select SQL重复执行。重复执行期间,Query Key对应的数据表不能有数据变动(比如添、删、改操作)

启用Query Cache,我们需要在hibernate.cfg.xml中进行配置,参考配置如下(只列出核心配置项):

 
  1. <hibernate-configuration> 
  2.  
  3.                                         <session-factory> 
  4.  
  5.                                                 <property name="hibernate.cache.user_query_cache">trueproperty> 
  6.  
  7.                                         session-factory> 
  8.  
  9.                                 hibernate-configuration> 
  10.  

在查询执行之前,将Query.Cacheable设置为true,而且每次都应该这样。比如:

 
  1. Query query=session.createQuery(hql).setInteger(0.15);  
  2.  
  3.                                 query.setCacheable(true);  
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值