Hibernate入门(三)之hibernate 的session的缓存机制

session缓存

缓存的生命周期
当打开session以后,该缓存就开始了,当session关闭以后,该缓存不存在,其生命周期和session的生命周期是一样的
如何将数据存放到缓存中
get方法
session.get方法可以把一个对象放入到session的缓存中,以主键标识该对象,所以我们把这样的主键也叫oid
save方法
Session.save方法可以把对象放入到缓存中
update方法
session.update方法把对象放入到了session缓存中
如何测试缓存中是否有数据

这里写图片描述

说明:可以利用session.getStatistics()方法统计出放入到session缓存中的对象的个数

如何清除缓存中的数据
clear方法(清除所有的缓存数据)

这里写图片描述

evict方法(清除指定的缓存数据)

这里写图片描述

close方法(清除所有的缓存数据)

session关闭,缓存也就不存在了,session中的数据也就被清除了

不同的session

这里写图片描述
说明:
103行的代码中的session和107行代码中的session是完全不一样的
也就是说每次用factory.opensession这个session都是不一样的

如何将数据库中的数据同步到缓存中

这里写图片描述

当执行117行代码的时候,发出了sql语句 session.get方法
当执行119行代码的时候,又发出了sql语句 session.refresh
把数据库中的数据同步到缓存中

如何将缓存中的数据同步到数据库中

Session.flush方法会去检查session缓存中各个对象的状态,如果该对象由临时状态转换过来的(没有主键值),则会让该对象生成一条insert语句,如果该对象有主键值,则会对照副本,决定是否发出update语句。当事务提交的时候,如果不显式的写session.flush的情况下,这个时候hibernate内部会默认的执行session.flush。

缓存的意义1

传统从数据库中获取数据的做法

这里写图片描述
这样每次获取一次数据都要从数据库中获取,这样的效率很低下,但如果使用缓存机制的话就不一样了
这里写图片描述

说明:
 在内存区域中,有一个对象Map<String,List<T>>,key值为sql语句,value值为该sql语句执行的结果,在客户端发出一个sql语句:
1、先从map中检查是否key值和该sql语句一样
2、如果一样,则从map提取数据,和数据库没有关系
3、客户端从map中得到相应的数据
4、第二步,如果不一样,则从数据库中查询
5、把查询出来的结果缓存到map中
6、把结果返回到客户端一份

缓存的意义2

这里写图片描述

Session的缓存提供了存放对象的容器,在这个容器中可以对对象随意操作,但是在执行session.flush的时候,hibernate内部会根据每一个对象的状态来决定发出insert语句还是update语句。这样在整个过程中,和数据库只交互一次,通过这样的方式可以提高效率

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值