session的缓存有两大作用
(1)减少访问数据库的频率。应用程序从内存中读取持久化对象的速度显然比到数据库中查询数据的速度快多了,音系Session的缓存
可以提高数据库访问性能
(2)保证缓存中的对象与数据库中的相关记录保持同步,位于缓存中的对象被称为持久化对象。当缓存中持久化对象的状态发生了变换,Session并不会立即执行相关的sql语句,这使得Session能够把几条相关的sql语句并为一条sql语句,以便减少访问数据库的次数,从而提高应用程序的性能,以下程序代码对Customer的name属性修改了两次:
当Session清理缓存时,只需执行一条update语句:
(3)当缓存中的持久化对象之间存在循环关联关系时,Session会保证不出现访问对象图的死循环,以及由死循环引起的JVM堆栈溢出异常。
Session在清理缓存时,按照以下顺序执行sql语句
按照应用程序调用的session.save()方法的先后顺序,执行所有对实体进行插入的insert语句
执行所有对实体进行更新的 update语句
执行所有对集合进行删除的delete语句
执行所有对集合元素进行删除,更新,插入的sql语句
执行所有对集合进行插入的insert语句
按照应用程序调用session.delete()方法的先后顺序,执行所有对实体进行删除的delete语句
下图列出了三种清理模式执行清理操作的时间点
FlushMode.AUTO是默认值,这也是优先考虑的清理模式,它会保证在整个事务中,数据保持一致。如果事务仅包含查询数据库的操作,而不会修改数据库的数据,也可以选用FlushMODE.COMMIT模式,这个可以避免在执行Session的查询方法时先清理缓存,以稍微提高应用程序的性能。
文章内容摘自《精通Hibernate(孙卫琴)》