首先说JCS;
JCS:指的是java cache system
JCS中是依据对象中的唯一标示进行存储 存储结构为map结构
为什么要说JCS呢,因为hibernate的缓存二级缓存与JCS密切相关,
1.什么是三级缓存呢?
一级缓存:指的是Session缓存,基于线程的缓存
二级缓存 指的是SessionFactory的缓存,是基于进程的缓存 (由于SessionFactory的声明周期和程序的声明周期是相同的,并且是单例的)
二级缓存又分为内置缓存和外置缓存
内置缓存是hibernate中自己编写的
外置缓存是hibernate借助第三方插件的缓存
外置缓存又分为class缓存和查询缓存
这两种缓存都采用的是map结构,前者的key保存的是sql语句的字符串,value保存的是主键id的集合
后者的key保存的是id,value保存的是id所对应的某一条记录封装后的对象
三级缓存 :指的是外置缓存中的查询缓存
由于查询缓存依赖于class缓存,所以说三级缓存是基于二级缓存之上的.
好吧,讲了这么多,缓存相信也讲的很明了了吧,接下来说说数据的加载吧,数据的加载与缓存有关系的,所以先讲述了三级缓存机制
加载机制分为两类:
一,即时加载 ,
list方法:发送sql语句,将会返回所有相关的数据,并进行缓存
get方法,利用对象的id,然后去一级缓存中找,如果有返回,否则去二级缓存中找,如果有返回,否则直接去数据库查找
二. 延时加载(在hibernate中也成为懒加载)
iterator方法发送sql语句,将会返回所记录的id集合,如果需要查看相应的属性值,则回去二级缓存的class缓存中根据id进行查找,如果没有, 才会去数据库中根据id查找
load方法 利用对象的id,然后去一级缓存中找,如果有则返回,如果没有,则不再去二级缓存中寻找,默认有,会返回对象的代理对象,如果查 看对象属性的的话,才去二级缓存查找,如果没有再去根据id进行数据库访问