hibernate 一级缓存,二级缓存,查询缓存

时间:2021-09-19 14:47:31

1、一级缓存是session级的缓存,session结束即事务提交,session关闭,缓存清除。效果不大

get方式:一个session内,第二次查询不连数据库。适用于一级缓存

load方式:懒加载查询(查询时不执行sql,使用结果时才会执行sql),第二次查询不连数据库。适用于一级缓存

createQuery(hql).list():查询了整个list,第一次调用list()时,执行sql。第二次查询时,又执行了sql,说明不使用一级缓存。也就是不使用二级缓存

   createQuery(hql).iterate():只查询了id,第一次调用iterate()时,执行sql,查询id(查询部分属性),当得到对象并且使用时,会出现查询整个实体语句。但第二个iterate()时,执行sql(不适用一级缓存),查询id(部分字段)   得到对象时不会产生语句,适用一级缓存。查询部分字段,返回object[]数组,不适用一级缓存。查询部分字段,封装成对象

例如String sql = select new UserPoJo(u.id,u.name) from UserPoJo u;第二次同样执行了sql,也不适用一级缓存,缓存只认全部字段的对象。

save:在一个session中,先新增save ,然后get 或者load   save方法也是使用一级缓存

2、二级缓存是sessionFactory级别缓存。进程级缓存,工厂级缓存,可以被所有session共享。提升性能用

主要是配置第三方厂家。有jar包,cache的策略文件(Eh..缓存),配置二级缓存厂商类,开启二级缓存,二级缓存属性,配置哪些类适用二级缓存,还需要类的属性(需要放到文件的最下面),例如只读。

二级缓存可以管理,可以通过evict清空

3、查询缓存

查询缓存存储的是部分属性,也叫普通属性

查询缓存 会存储实体对象的id

查询缓存的生命周期不确定

查询缓存也需要配置

list():一个session中,第二次查询不执行sql,说明适用查询缓存。查询的是部分字段;两个session中,同样适用,说明查询缓存与session无关