您的位置:首页 > 其它

Session脏检查及清理缓存机制

2017-03-14 17:06 686 查看
        今天看hibernate书,看到“理解Session的缓存”这一张脏检查及清理缓存的机制后,突然明白程序中session并非一定要执行update()方法。没有执行update()方法,对象仍会与数据库进行数据交互。
  Session脏检查及清理缓存机制:



 
  Session缓存中对象的属性每次改变时,Session不会立即清理缓存及执行Update SQL,而是会在特定时间清理缓存(执行相应的sql),提交事务。

清理缓存时,会相应的改变对象的状态。

  Java对象在内存中有四个状态:临时状态(transient)、持久化状态(persistent)、游离状态(detached)、删除状态(removed)。



  Session做任何的操作,如果没有显示的调用commit()方法,都不会清理缓存、执行相应的SQL、提交事务。对象在Hibernate持久层中做不同的操作,会相应的改变其状态。如图上。

  Session会在特定的时间清理缓存。那么特定时间指的是什么时候呢?
  1) 当应用程序调用org.hibernate.Transaction的commit()方法时,commit()方法会先清理缓存,然后向数据库提交事务。先清缓存再提交事务,有两个好处,一可以减少访问数据库的频率,二可以缩短当前事务对数据库中相关资源的锁定时间。

  2) 当应用执行一些查询操作时。如缓存中持久化对象属性已改变,就会先清缓存,使得Session缓存与数据库同步,从而保证查询数据的正确性。

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

  Session在特定的时间清理了缓存,那么是如何清理缓存的呢?

  1) 按照应用程序调用session.save()方法的先后顺序,执行所有对实体进行插入的insert语句。

  2) 执行所有对实体进行更新的update语句。

  3) 执行所有对集合进行删除的delete语句。

  4) 执行所有对集合元素进行删除、更新或者插入的SQL语句。

  5) 执行所有对集合进行插入的insert语句。

  6) 按照应用程序调用sessiondelete()方法的先后顺序,执行所有对实体进行删除的delete语句。

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: