Hibernate中的缓存分为一级缓存和二级缓存,这两个级别的缓存都位于持久化层,并且存储的都是数据库数据的备份。图1-6为Hibernate提供的两种缓存,两者区别如下:
1.一级缓存:一级缓存本质上是自带的不可卸载的,一级缓存的生命周期与session是一致的,一级缓存称为session级别的缓存。
2.二级缓存:默认没有开启,是需要手动配置才可以使用的。二级缓存的优势在于可以在多个session中共享数据,二级缓存称为是sessionFactory级别的缓存。
图1-6 Hibernate提供的两种缓存
一级缓存其实就是Session缓存。Session缓存是一块内存空间,用于存储与管理Java对象。在使用Hibernate查询对象时,首先会使用对象的OID值在Hibernate的一级缓存中查找,如果找到匹配的对象,则直接将该对象从一级缓存中取出使用;如果没有找到匹配的对象,则会去数据库中查询对应的数据。当从数据库中查询到所需数据时,该数据信息会存储到一级缓存中。由此可知,Hibernate一级缓存的作用就是减少对数据库的访问次数。
Hibernate的一级缓存具有如下特点。
·当应用程序调用Session接口的save()、update()、saveOrUpdate时,如果Session缓存中没有相应的对象,则Hibernate就会自动把从数据库中查询到的相应对象信息加入到一级缓存中。
·当调用Session接口的load()、get()方法,以及Query接口的list()、iterator()方法时,会判断缓存中是否存在该对象,有则返回,不会查询数据库,如果缓存中没有要查询的对象,则再去数据库中查询对应对象,并添加到一级缓存中。
·当调用Session的close()方法时,Session缓存会被清空。
·Session能够在某些情况下,按照缓存中对象的变化,执行相关的SQL语句同步更新数据库,这一过程被称为刷出缓存(flush)。
在默认情况下,Sesssion在如下几种情况中会刷出缓存。
(1)当应用程序调用Transaction的commit()方法时,该方法先刷出缓存(调用session.flush()方法),然后再向数据库提交事务(调用commit()方法)。
(2)当应用程序执行一次查询操作的时候,如果缓存中持久化对象的属性已经发生了变化,会先刷出缓存,以保证查询结果能够反映持久化对象的最新状态。
(3)调用Session的flush()方法。