Hibernate学习笔记(六)通过Hibernate操纵对象(1)-Session的缓存

通过Hibernate操纵对象

Session的缓存
在Session接口的实现中包含一系列的Java集合,这些Java集合构成了Session的缓存
Session的三大作用:
1.减少访问数据库的频率。
2.当缓存中的持久化对象之间存在循环关联关系时,Session会保证不会出现访问对象图的死循环,以及由死循环引起的JVM堆栈溢出的异常。
3.保证数据库中的相关记录与缓存中的相应对象保持同步。
Session在清理缓存的时候会自动的进行脏检查(dirty-check),如果发现Session缓存中的对象与数据库中相应记录不一致,就会根据对象的最新属性
去同步更新数据库。

脏检查及清理缓存的机制
当一个对象加入到Session缓存中时,Session会为对象的值类型的属性复制一份快照(SnapShot),当Session清理缓存时,会先进行脏检查,
即比较对象的当前属性与它的快照,来判断对象的属性是否发生了变化。如果发生了变化,就称这个对象是“脏对象”,Session会根据脏对象的最新
属性来执行相关SQL语句。
当Session缓存中对象的属性每次发生了变化,Session并不会立即清理缓存及执行相关的SQL update语句,而是在特定的时间按点才清理缓存,
这使得Session能够把几条相关的SQL语句合并为一条SQL语句,减少访问数据库的次数。

清理缓存的顺序
(1)执行所有对实体进行更新的update语句。
(2)执行所有对集合进行删除的delete语句。
(3)执行所有对集合元素进行删除、更新或者插入的SQL语句。
(4)执行所有对集合进行插入的insert语句。
(5)按照应用程序调用session.delete()方法的先后顺序,执行所有对实体进行删除delte语句。
(6)例外情况:如果对象使用native生成器来生产OID,调用Session的save()方法时,会立即执行向数据库插入该实体的insert语句。
清理缓存时间点
(1)调用org.hibernate.Transaction的commit()方法,先清理缓存,在提交事务。原因:一方面减少访问频率,另一方面减少锁定时间。
(2)执行一些查询操作时,如果缓存中持久化对象的属性发生了变化,就会先清理缓存。
(3)调用Session的flush()方法。

Session缓存的设置
session.setFlushMode(FlushMode.AUTO) 默认值
清理缓存的模式 各种查询方法 Transaction的commit()方法 Session的flush()方法
FlushMode.AUTO 清理 清理 清理
FlushMode.COMMIT 不清理 清理 清理
FlushMode.NEVER 不清理 不清理 清理

flush()方法适用场合
(1)插入、删除或更新摸个持久化对象会引发数据库中的触发器。
(2)混合适用Hibernate API和JDBC API。
(3)JDBC驱动程序不健壮,导致Hibernate在自动清理缓存的模式下无法正常工作。

你可能感兴趣的:(java,Hibernate)