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

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无关

时间: 2024-10-24 06:28:28

hibernate 一级缓存,二级缓存,查询缓存的相关文章

Hibernate 利用缓存(一级、二级、查询)提高系统性能

在hibernate中我们最常用的有三类缓存,分别为一级缓存.二级缓存和查询缓存,下面我们对这三个缓存在项目中的使用以及优缺点分析一下. 缓存它的作用在于提高性能系统性能,介于应用系统与数据库之间而存在于内存或磁盘上的数据. 首先,来看一下一级缓存它默认开启且很常用. 一级缓存 同是一种缓存常常可以有好几个名字,这是从不同的角度考虑的结果,从缓存的生命周期角度来看一级缓存又可以叫做:sessin缓存.线程级缓存.事务级缓存.我们编程中线程.事务.session这三个概念是绑定到一起的放到了thr

hibernate一级和二级缓存介绍

一级缓存Hibernate缓存包括两大类:Hibernate一级缓存和Hibernate二级缓存Hibernate一级缓存又称为"Session的缓存",它是内置的,不能被卸载(不能被卸载的意思就是这种缓存不具有可选性,必须有的功能,不可以取消session缓在第一级缓存中,持久化类的每个实例都具有唯一的OID存 .在缓存中的对象,具有持久性,session对象负责管理.一级缓存的优点是使用同一个session对象多次查询同一个数据对象,仅对数据库查询一次例如:session.load

hibernate回顾之缓存机制-一级缓存、二级缓存、查询缓存

在介绍hibernate的缓存机制前,我们先了解一下什么是缓存: 缓存(Cache): 计算机领域非常通用的概念.里面放东西,说白了缓存就是一个集合.它介于应用程序和永久性数据存储源(如硬盘上的文件或者数据库)之间,其作用是降低应用程序直接读写永久性数据存储源的频率,从而提高应用的运行性能.缓存中的数据是数据存储源中数据的拷贝并且缓存的物理介质通常是内存. 了解jdbc的人都知道,当需要连接数据库时,一般都会做一个连接池,那么连接池和缓存有什么区别呢? 相同点:两者都可以是在内存里,实现时一样的

hibernate的查询缓存和二级缓存的配合使用

我的上一篇博客Hibernate缓存体系之查询缓存(query cache),以及list和iterate方法的差别介绍了查询缓存的概念,以及list和iterate的差别.读者可能注意到:那篇博客測试的前提是,仅仅开启查询缓存,没有开启二级缓存. 通过各种情形測试,我们能够得出一个结论:仅仅开启查询缓存.不开启二级缓存是没有意义的. 为什么这么说呢?上一篇博客能够看出.不开启二级缓存,iterate()方法存在N+1次数据库查询问题,list方法最多仅仅能命中id.也须要N次数据库查询,不管是

笔记:Hibernate 查询缓存

Hibernate 的一级缓存和二级缓存都是对实体进行缓存,他不会缓存普通属性,如果想对普通熟悉进行缓存,可以考虑使用查询缓存. 对于查询缓存来说,他缓存的Key就是查询所用的 HQL 或者 SQL 语句,查询缓存不仅要求使用的语句相同,还要求参数必须一致,查询缓存默认是关闭的,为了开启查询缓存,需要修改 Hibernate.cfg.xml 配置文件,增加如下配置: <property name="hibernate.cache.use_query_cache">true&

day37 07-Hibernate二级缓存:查询缓存

查询缓存是比二级缓存功能更强大的缓存.必须把二级缓存配置好之后才能用查询缓存,否则是用不了的.二级缓存主要是对类的缓存/对象缓存.查询缓存针对对象也是可以的(因为功能比二级缓存更强大),而且还可以针对类中的属性. select cname from Customer.这种二级缓存是缓存不了的.二级缓存只能缓存的是整个的对象.而我们查询缓存里面可以缓存对象的属性.这是查询缓存与二级缓存最大的区别. @Test // 查询缓存的测试 public void demo9(){ Session sess

Hibernate查询缓存的利弊

在使用hibernate二级缓存时适不适合开启查询缓存? 本人不建议使用查询缓存,因为查询缓存要求完全相同的查询sql语句才会起作用,所说的查询缓存是针对第二次查询时 sql语句与第一次sql语句完全相同 那么就可以从缓存中取数据而不去数据库中取数据了,在不启用查询缓存的情况下 每次的查询数据也会缓存到二级缓存的 只不过每次查询都会去查询数据库(不包括根据ID查询),启用查询缓存很麻烦 需要每次查询时 调用Query.setCacheable(true)方法才可以,如:List<OrgiData

Spring+SpringMVC+MyBatis深入学习及搭建(八)——MyBatis查询缓存

1.什么是查询缓存 mybatis提供查询缓存,用于减轻数据库压力,提高数据库性能. mybatis提供一级缓存和二级缓存. 一级缓存是SqlSession级别的缓存.在操作数据库时需要构造sqlSession对象,在对象中有一个数据结构(HashMap)用于存储缓存数据.不同的sqlSession之间的缓存数据区域(HashMap)是互相不影响的. 二级缓存是mapper级别的缓存,多个sqlSession去操作同一个Mapper的sql语句,多个sqlSession可以共用二级缓存,二级缓存

让EFCore更疯狂些的扩展类库(二):查询缓存、分部sql、表名替换的策略配置

前言 上一篇介绍了扩展类库的功能简介,通过json文件配置sql语句 和 sql语句的直接执行,这篇开始说明sql配置的策略模块:策略管理器与各种策略的配置. 类库源码:github:https://github.com/skigs/EFCoreExtend 引用类库:nuget:https://www.nuget.org/packages/EFCoreExtend/ PM> Install-Package EFCoreExtend 策略管理器功能简介 用于管理策略 与 策略执行器和调用(目前分

mybatis学习笔记(14)-查询缓存之中的一个级缓存

mybatis学习笔记(14)-查询缓存之中的一个级缓存 mybatis学习笔记14-查询缓存之中的一个级缓存 查询缓存 一级缓存 一级缓存工作原理 一级缓存測试 一级缓存应用 本文主要讲mybatis的一级缓存.一级缓存是SqlSession级别的缓存. 查询缓存 mybatis提供查询缓存.用于减轻数据压力,提高数据库性能. mybaits提供一级缓存,和二级缓存. 一级缓存是SqlSession级别的缓存.在操作数据库时须要构造sqlSession对象,在对象中有一个数据结构(HashMa