hibernate中的三级缓存与加载

首先说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进行数据库访问


你可能感兴趣的:(缓存机制)