Session 缓存概述
Session级别的缓存是Hibernate的一级缓存,主要提供事务级别的缓存处理,用来提高访问数据库的性能等.
在Session的接口实现中包含一系列的java集合,这些集合构成了Session的缓存.
只要Session实例没有结束生命周期,存放在它缓存中的对象也不会结束生命周期.
当Session 通过save()方法持久化一个对象时,这个对象被加入到Session缓存中去, 这以后,只要缓存没有被清空,这个对象就被存储在Session的集合对象中,即存在于缓存之中.
当Session 通过get()方法试图从数据库中得到一个对象时, Session会先判断这个对象是否已经存在与缓存中, 如果存在这从缓存中获得, 从而避免访问数据库, 提高了性能.
Session 缓存的作用
(1) 减少访问数据库的频率.
(2) 当缓存中的持久化对象之间存在循坏关联关系时,Session会保证不出现访问对象图的死循环, 以及由死循环引起的JVM堆栈溢出异常.
(3) 保证数据库中的相关记录和缓存中相应的对象保持同步.
Note: Session 在清理缓存的时候,会自动进行脏检查, 如果发现Session缓存中的对象和数据库的不一致,则会根据对象的最新属性去同步更新数据库.
脏检查及清理缓存的机制
当一个对象被加入到Session的缓存中的时候,Session 会为这个对象复制一份快照, 当session 清理缓存的时候, 将用最新的对象和快照进行对比来判断对象是否经过了更新, 然后根据脏对象的最新属性生成相关SQL语句 更新数据库.
Session 清除缓存的默认时间点
(1) 当程序调用hibernate Transaction的commit()方法的时候, commit方法先清理缓存(调用Session的 flush()方法), 然后再向数据库提交事务.
(2) 当程序执行一些查询操作的时候, 如果缓存中的持久化对象属性以及发生了变化, 就会先清理缓存, 使得缓存与数据库进行同步.
(3) 当程序显示的调用Session的 flush方法的时候.
如果不希望Session 在以上默认的时间点进行缓存的清理, 也可以通过Session 的 setFlushMode()方法来显示的设定删除的时间点.
FlushMode 类定义了3种不同的清理模式: FlushMode.AUTO, FlushMode.COMMIT和FlushMode.NEVER.
清理缓存的模式 | 各种查询方法 | Transaction的commit()方法 | Session的flush()方法 |
FlushMode.AUTO(默认) | 清理 | 清理 | 清理 |
FlushMode.COMMIT | 不清理 | 清理 | 清理 |
FlushMode.NEVER | 不清理 | 不清理 | 清理 |
Flush()方法适用场合
(1) 插入,删除或更新某个持久化对象会引发数据库的触发器.
(2) 在应用程序中混合使用hibernaye API和JDBC API.
(3) JDBC驱动程序不健壮, 自动清理模式中无法正常清理.