Hibernate(5) 一级缓存

Hibernate的一级缓存

Hibernate提供了优化,缓存机制就是其中的一种,用于减少对数据库的访问,提高效率,Hibernate提供了一级缓存、二级缓存,这里只对一级缓存做出简单的总结

1.一级缓存的特点:
  • 默认是打开的
  • 作用范围:一个线程中Session对象创建完成到这个Session对象被销毁
  • 仅保存持久态的对象
  • 对持久态对象所做的更改会自动提交到数据库中

2.验证一级缓存的存在

方式:在一个事务中,使用一个Session对象查询一条结果,在未释放该Session对象的时候,再次查询同一条结果。
可以在控制台观察到仅仅输出了一条查询语句,证明Hibernate仅仅访问一次数据库,第二次的查询就是从缓存里面取得的。思路和代码都比较简单,就不贴了。


3.一级缓存的减少对数据库访问的具体执行形式

这里写图片描述

  1. 创建Session对象,此时也会有一级缓存以及其快照区,快照区就是一级缓存的一个副本,其作用下面会说到。
  2. Session对象执行一次查询的时候,首先会到它的一级缓存里面查找是否存在被查找的对象,如果存在就直接返回,然后本次查询结束。但是不存在的话就接着执行步骤3.
  3. 在一级缓存未找到被查询对象,去数据库查找,当查找到对象之后。将该对象添加到一级缓存以及快照区里面。并将对象作为get()方法对象返回值返回。
  4. 再次执行查询的时候,同样先去一级缓存,此时在缓冲找到了对象。 就直接返回,查询结束。
  5. 当事务提交的时候,Session会被销毁,与之相关联的一级缓存以及快照区也会被销毁。并且会检测持久态对象以决定是否更新,这一过程在下面会说明。

可以明确上面验证一级缓存存在的思路,需要说明的是,判断一级缓存中对象与自己要获取的对象是否是相同的依据就是使用主键值,在本实例中,两次获取的对象键值都为1。


4.一级缓存对持久态对象实现自动更新的执行形式

同样的可以进行一个小测试来验证这种自动更新的形式 :
思路:在一个事务中,获取一个实体对象,然后对该对象进行更改,但是不使用update()/save()/updateOrSave()方法更新更改后的值到数据库,而是直接提交事务。此时进入数据库查看被操作的值,已经变为了更新后的值,这就是对持久化对象的自动更新,虽然我们并未主动提交更新后的值。而它的具体执行形式如下图所示:
这里写图片描述

  1. 创建Session对象,与该对象随之产生的还有一级缓存以及其快照区
  2. 加载一个实体对象,首次加载一级缓存不存在,去数据库加载并将其添加到一级缓存以及快照区。最后将获取的结果返回出去,本例为:person对象
  3. 对获取到的person对象进行修改,所做更改不但作用于person这个对象,还作用于一级缓存里面的对象。一级缓存里面的对象的属性也被更改,但是快照区的始终保持不变
  4. 提交事务,检查快照区与一级缓存中的对象是否一致以证明是否修改,当检测到二者不同的时候,认为做出了更改。此时Hibernate就会将一级缓存中修改后的对象进行持久化。即便我们并没有提交修改

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值