一级缓存
session级别的缓存,当我们使用了get load find Query等查询出来的数据,默认在session中就会有一份缓存数据,缓存数据就是从数据库将一些数据拷贝一份放到对应的地方.
一级缓存不可卸载: (只要使用了session,肯定用到了session的缓存机制,是hibernate控制的,我们不能手动配置)
一级缓存的清理:
close clear这两种方式会全部清理; evict方法是将指定的缓存清理掉
二级缓存
sessionFactory级别的缓存,可以做到多个session共享此信息
sessionFactory缓存分类:
1. 内缓存: 预制的sql语句,对象和数据库的映射信息
2. 外缓存:存储的是我们允许使用二级缓存的对象
适合放在二级缓存中的数据:
1. 经常被修改的数据
2. 不是很想重要的数据,允许出现偶尔并发的数据
3. 不会被并发访问的数据
4. 参考数据
适合放到一级缓存中的数据:
1. 经常被修改的数据
2. 财务数据,绝对不允许出现并发
3. 与其它应用共享的数据
Hibernate的二级缓存策略的一般过程:
1. 条件查询的时候,
String hql = “from 类名”;
这样的SQL语句查询数据库,一次获得所有的数据库.
2.把获得的所有数据对象根据ID放入到第二级缓存中
3.当Hibernate根据ID访问数据对象的时候,首先从Session一级缓存中查;查不到,如果配置了二级缓存,那么从二级缓存中查;查不到,再查询数据库,把结果按照ID放入到缓存
4.删除 更新 增加数据的时候,同时更新缓存
注: Hibernate的二级缓存策略,是针对于ID查询的缓存策略,对于条件查询则毫无作用.为此,Hibernate提供了针对条件查询的Query缓存
Query缓存策略的过程如下:
1. Hibernate首先根据这些信息组成一个Query Key,Query Key包括条件查询的请求一般信息:SQL, SQL需要的参数,记录范围(起始位置rowStart,最大记录个数maxRows),等。
2. Hibernate根据这个Query Key到Query缓存中查找对应的结果列表。如果存在,那么返回这个结果列表;如果不存在,查询数据库,获取结果列表,把整个结果列表根据Query Key放入到Query缓存中。
3. Query Key中的SQL涉及到一些表名,如果这些表的任何数据发生修改、删除、增加等操作,这些相关的Query Key都要从缓存中清空。
二级缓存的配置流程:
1 .a)在cfg文件中打开二级缓存
b)配置使用二级缓存的factory
c)在 mapping下(引入映射文件)配置要使用二级缓存的类
也可以在hbm文件的class中通过cache标签配置
2.在cfg的同级目录下配置ehcache.xml文件
a)diskStore:配置缓存磁盘的路径
b)defaultCache:默认配置
maxElementsInMemory:允许在内存中缓存的对象个数
eternal: 缓存是否永久有效
timeToIdleSeconds: 缓存对象的允许的最大空闲时间
timeToLiveSeconds: 缓存对象允许的最大存活时间
overflowToDisk: 超出指定对象个数后是否允许存入磁盘
c)cache:某个需要缓存的类单独设置
3.使用时,query需要配合setCachable(true)来使用
查询缓存:
开启查询缓存,如果不开启,每次查询只存主键,开启后可以存其它字段,拿到一条完整的记录.(一般配合二级缓存使用,两个都设置为true).
如果没有开启二级缓存,只开启查询缓存,此时缓存中只存储查询出来的数据id
如果后续再查询相同的数据,根据缓存中的id分条查询数据