Hibernate 脏检查和刷新缓存机制

刷新缓存:

Session是Hibernate向应用程序提供的操作数据库的主要接口,它提供了基本的保存,更新,删除和加载java对象的方法,Session具有一个缓存,可以管理和追踪所有持久化对象,对象和数据库中的相关记录对应,在某些时间点,Session会根据缓存中对象的变化来执行相关SQL语句,将对象包含的变化数据更新到数据库中,这一过程成为刷新缓存.

脏检查:

当刷新缓存时,Hibernate会对Session中的持久状态的对象进行检测,判断对象的数据是否发生了改变,这种判断成为脏检查,

脏检查的原理:

当一个对象被加入到Session缓存中时,Session会为对象的值类型的属性复制一份快照.当Session刷新缓存时,会先进行脏检查,即比较对象的当前属性与它的快照,来判断对象的属性是否发生了改变,如果发生了改变,Session会根据脏对象的最新属性值来执行相关的SQL语句,将变化更新到数据库中.

运行结果:

从结果可以看出,sql语句只生成了一次,证明第二次修改经过脏检查发现数据并没有进行改变,所以没有向数据库发送SQL语句!

缓存清理机制

当Session缓存中对象的属性每次发生了变化,Session并不会立即清理缓存和执行相关的SQL update语句,而是在特定的时间点才清理缓存,这使得Session能够把几条相关的SQL语句合并为一条SQL语句,一遍减少访问数据库的次数,从而提高应用程序的数据访问性能。

在默认情况下,Session会在以下时间点清理缓存。

  1. 当应用程序调用org.hibernate.Transaction的commit()方法的时候.commit方法先清理缓存,然后再向数据库提交事务。Hibernate之所以把清理缓存的时间点安排在事务快结束时,一方面是因为可以减少访问数据库的频率,还有一方面是因为可以尽可能缩短当前事务对数据库中相关资源的锁定时间。
  2. 当应用程序执行一些查询操作时,如果缓存中持久化对象的属性已经发生了变化,就会清理缓存,使得Session缓存与数据库已经进行了同步,从而保证查询结果返回的是正确的数据。
  3. 当应用程序显示调用Session的flush()方法的时候。
相关推荐
forestsea1 分钟前
深入理解Redisson RLocalCachedMap:本地缓存过期策略全解析
redis·缓存·redisson
爬山算法1 小时前
Hibernate(88)如何在负载测试中使用Hibernate?
java·后端·hibernate
啦啦啦_99992 小时前
Redis-0-业务逻辑
数据库·redis·缓存
自不量力的A同学2 小时前
Redisson 4.2.0 发布,官方推荐的 Redis 客户端
数据库·redis·缓存
fengxin_rou3 小时前
[Redis从零到精通|第四篇]:缓存穿透、雪崩、击穿
java·redis·缓存·mybatis·idea·多线程
fengxin_rou3 小时前
黑马点评实战篇|第二篇:商户查询缓存
缓存
笨蛋不要掉眼泪4 小时前
Redis哨兵机制全解析:原理、配置与实战故障转移演示
java·数据库·redis·缓存·bootstrap
fen_fen12 小时前
Oracle建表语句示例
数据库·oracle
ALex_zry16 小时前
Redis Cluster 分布式缓存架构设计与实践
redis·分布式·缓存
此刻你16 小时前
常用的 SQL 语句
数据库·sql·oracle