hibernate 缓存总结

缓存的分类:事务级别的缓存、应用程序级别的缓存、分布式缓存

hibernate 缓存:
分为三种缓存:
一级缓存\二级缓存\查询缓存(依赖于二级缓存)

一级缓存:session级别的缓存,依赖于session生命周期
 不受我们管理,我们只能通过session.evict() 、session.clear() 清除一级缓存
save()、update()或 saveOrUpdate()、load()、 get()、list()、iterate() 我们做上述操作的同时,hibernate会把上述操作的对象放入到缓存中

二级缓存:sessionFactory级别的缓存,依赖于sessionFactory的生命周期
hibernate默认提供的是HashtableCache的二级缓存实现,它仅仅用于开发测试
所有我们正常情况会去配置一个第三方的缓存插件(EHCache、OSCache、SwarmCache、JBOSSCache)
二级缓存是默认是开启的
通过在配置文件中添加cache.use_second_level_cache,值为false可以关闭

配置二级缓存:
1 在配置文件添加cache.provider_class,值为:org.hibernate.cache.EhCacheProvider
(如果用的是ehcache1.4以上jar包,则值为:net.sf.ehcache.hibernate.EhCacheProvider  ;要加三个jar包:backport-util-concurrent.jar,commons-logging.jar,ehcache-1.4.1.jar)
2 在src下,添加ehcache.xml文件,文件模板在hibernate源代码文件的etc文件夹下
3 在要使用缓存的类中,在class节点下配置: <cache usage="read-write"/>

查询缓存:主要是用于通过hql或qbc查询的缓存,主要是对list起作用 ,是需要我们开启的
查询缓存默认是关闭的,通过在配置文件中配置cache.use_query_cache,值为true来开启
开启之后,还不能使用,必须在程序中设置query.setCacheable(true);

查询缓存是依赖于二级缓存的

一级缓存、二级缓存只能存实体对象,
一、
第一次使用查询缓存和list查询的时候:得到 :
1查询结果
2 如果是对象,它把结果放入一级缓存和二级缓存
3 如果是对象,把sql语句、id、类型放入查询缓存中

再一次使用list查询同样的hql的时候,会取得查询缓存里面的id去二级缓存中查询,如果查不到,根据id查询数据库


iterate方法:
查询对象的时候:
 先查询所有id,
 在使用的时候,根据id去一级缓存,二级缓存中去查询实体对象,如果查不到,根据id,一个一个发送sql语句去数据库中查,N+1次

二、
查询属性的时候
list:查询缓存中会保存sql,结果集,不依赖于二级缓存
iterate:完完全全依赖于一级、二级缓存,如果二级缓存关闭,每次都得重新发送sql语句查询数据库

get方法:
  1 在使用get方法查询的时候,它就会发送SQL语句,查询数据库,而不是在调用它的某个属性的时候
  2 在查询数据库,找不到的情况下,返回null;
load方法:
  1 在调用它的某个属性的时候才会去发送SQL语句,查询数据库
  2 找不到的情况下,就报异常


get方法会先查找一级缓存,查不到,再查找二级缓存,找不到,直接查询数据库,数据库查不到,返回null
load方法会先查找一级缓存,查不到,再查找二级缓存,找不到,直接查询数据库,数据库查不到,报异常

//---略---
在同一个session中:
 get方法会先查找一级缓存,找不到再去数据库查询?
 load方法会先查找一级缓存,找不到再去数据库查询?
不同session中:
 get方法会先查找一级缓存,查不到,直接查询数据库
 load方法同
//---略---

 


 

所以,当我们知道数据库中肯定有这条记录的时候,就是load,load它效率高点

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值