首页 > 代码库 > 脏检查和快照的故事

脏检查和快照的故事


什么是脏检查?

  解析:当事务提交时,Hiberante会对Session中持久状态的对象进行检测,判断对象的数据是否发生了改变。

如何进行脏检查?

  解析:当一个Dept对象被加入到Session缓存(有人又称为 一级缓存  后者是内部缓存)中时,Session会为Dept对象的值类型的属性复制一份快照。当Session刷新缓存时,会先进行脏检查,即比较Dept对象的当前属性与它的快照,来判断Dept对象的属性是否发生了变化。如果发生了变化Session会根据脏对象的最新属性值来执行相关的SQL语句,将变化更新到数据库中

   Session具有一个缓存,可以管理和跟踪所有持久化对象,对象和数据库中的相关记录对应。

脏检查和快照的图解过程:

  技术分享


缓存清理机制:

1.当应用程序调用org.hibernate.Transaction的commit()方法的时候.commit方法先清理缓存,然后再向数据库提交事务。Hibernate之所以把清理缓存的时间点安排在事务快结束时,一方面是因为可以减少访问数据库的频率,还有一方面是因为可以尽可能缩短当前事务对数据库中相关资源的锁定时间。

2.当应用程序执行一些查询操作时,如果缓存中持久化对象的属性已经发生了变化,就会清理缓存,使得Session缓存与数据库已经进行了同步,从而保证查询结果返回的是正确的数据。

3.当应用程序显示调用Session的flush()方法的时候。


 

 

脏检查和快照的故事