Session的缓存又称为Hibernate的第一级缓存。Session的缓存是内置不能被卸载的,Session的缓存是事务范围的缓存(Session对象的生命周期通常对应一个数据库或一个事务)。Session缓存中的对象为持久化对象,Session根据持久化对象状态的改变同步更新数据库。在一级缓存中,持久化类的每次实例都有唯一的对象标识符(OID)。正常情况下,一级缓存由Hibernate自动维护的,无需人工干预。
Session缓存的应用:
Session接口时Hibernate向应用程序提供操纵数据库的最主要的接口,它提供了的基本的保存、更新、删除和加载等方法。
(1)save()、update()和saveOrUpdate():当session对象调用save()方法、update()方法或saveOrUpdate()方法持久化一个对象后,该对象就会被加入到session的缓存中。
(2)get()和load():当session对象调用get()方法或load()方法从数据库中取出一个对象,该对象也会被加入到session缓存中。
(3)close():当session对象调用close()方法时,session缓存就会被清空。
Session缓存的作用:
(1)减少数据库的访问频率:应用程序从内存中读取持久化对象的速度比到数据库中查询数据要快得多,因此使用Session缓存可以提高数据库的访问性能。
(2)保证缓存中对象与数据库的数据同步:当缓存中持久化对象的状态发生改变时,Session不会立即执行相关的SQL语句,这使得Session能够把几条相关的SQL语句合并为一条SQL语句,以减少数据库的访问次数,提高访问效率。
(3)当缓存中的持久化对象之间存在循环关联关系时,Session会保证不出现访问对象图的死循环,以及由死循环引起的JVM堆栈溢出异常。
一般情况下,Session会在下面的时间点清理缓存:
(1)当应用程序调用Transaction的commit()方法时,commit()方法先清理缓存,然后再向数据库提交事务。
(2)当应用程序显示调用Session的flush()方法的时候。
(3)当应用程序调用Session的find()或itreate()时,若缓存中持久化对象的属性发生改变,先清理缓存,以保证查询的结果能反映持久化对象的最新状态。