今天看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语句。