当前位置:首页>开发>正文

请问hibernate的查询缓存是什么 Hibernate查询缓存失效

2023-04-24 18:08:21 互联网 未知 开发

 请问hibernate的查询缓存是什么 Hibernate查询缓存失效

请问hibernate的查询缓存是什么?

查询缓存,就是在内存建立空间用来保存上次查询结果,下次再进行同样的查询时,就不用再从数据库查找结果,大大的提高速度。

不过内存和数据库的数据没有完全同步,所以不适用于多个程序共同访问同一数据表的的情况;这样的话,数据表的数据已经被其他程序修改,有可能内存里存在的数据是旧数据,这就是所谓的脏数据。

而且Hibernate和数据库的查询缓存,在对一个数据表记录进行修改时,会把有关这个表的全部查询缓存清空,以保证减少脏读问题。

所以查询缓存只适用于非多服务器同时访问的数据库,而且读取大大多于修改操作的数据表上

Hibernate查询缓存失效

Hibernate的一级缓存是由Session提供的,因此它只存在于Session的生命周期中,也就是当Session关闭的时候该Session所管理的一级缓存也会立即被清除。 Hibernate的一级缓存是Session所内置的,不能被卸载,也不能进行任何配置。

怎么开启hibernate的缓存

1 缓存的概念,以及用途
1) 缓存:(hibernate单独用来保存数据,开辟一块内存)
缓存就是数据库中的数据在内存中的临时的容器,包含
了数据库表中的数据,位于数据库和访问层之间
2)缓存优点: hibernate做查询的时候,首先去缓存中
查询要找的数据,有直接使用,没有再发sql语句去数据库
中真实查询
把用户经常访问的数据,放入缓存当中,这样每次
就不需要去数据库中访问这些常用信息,可以提高系统的
性能。
3)缓存的分类:
a) 一级缓存
b) 二级缓存
c) 查询缓存

2 一级缓存
1)内部结构:一级缓存的内部结构就是一个map
map的key就是id,map的value就是实体对象,该结构
导致一级缓存不能缓存属性
2)一级缓存的生命周期:
一级缓存的生命周期与session有关,session创建并
维护一级缓存,session关闭,一级缓存销毁
3)hibernate中API使用缓存:
a) 可以读写一级缓存的: get , load,Iterate
b) 可以写入一级缓存的: save ,list
4)hibernate一级缓存无法禁用:
5)一级缓存的管理:session管理一级缓存(把一级缓存
数据清空clear)

3 二级缓存
1)二级缓存也叫进程级缓存或SessionFactory级缓存,
二级缓存可以让所有的session所共享
2)二级缓存的生命周期跟SessionFactory一致,
SessionFactory管理二级缓存
3)二级缓存的结构是Hashtable,只能保持实体对象,
不能保存属性,开发当中需要使用第3方提供的缓存组件
4)ehcache.xml
//在该二级缓存中,最多可以缓存对象的数量
maxElementsInMemory="1000"
//缓存在二级缓存中的对象是否永远都有效,一般配置为false
eternal="true"
//"钝化":两次访问该二级缓存中对象的,间隔时间
timeToIdleSeconds="120"
//二级缓存中的对象从创建到消亡的时间
timeToLiveSeconds="120"
//如果超过缓存的访问,可以写入到硬盘上的
overflowToDisk="true"
5)如何使用二级缓存
a)导入第3方ehcache-1.2.3.jar
b)导入ehcache.xml 配置文件,放入src目录下
c)修改hibernate.cfg.xml
(一)指明二级缓存的提供商


org.hibernate.cache.EhCacheProvider

(二)开启二级缓存

true
d)指明那个对象放入二级缓存中


6) 使用二级缓存
能够读写二级缓存: get load iterate
能够写入而不能读取二级缓存: list
7) 二级缓存的管理
使用SessionFactory来管理我们的二级缓存
首先修改HibernateUtil,添加获得SessionFactory的方法
SessionFactory factory = HibernateUtil2.getSessionFactory()
//factory.evict(Student.class, 1):去掉二级缓存中
//id为1的student对象
//factory.evict(Student.class,1)
//factory.evict(Student.class):去掉二级缓存中所有的
//student对象

4 查询缓存
1)查询用来保存属性的,对实体对象的结果集只保存id
2)查询缓存的生命周期,只有当前的表发生改变,查询
缓存的生命周期结束
3)如何使用查询缓存:
a)修改hibernate.cfg.xml文件,开启查询缓存

true
b)在Query对象中必须手动开启查询缓存

hibernate 二级缓存和查询缓存有什么区别

一级缓存为session级别的缓存,为hibernate内置缓存,你从数据库load或get数据的时候会先去一级缓存上找。如果找到,则不会从数据库中存,否则从数据库中取。一级缓存会在session关闭时自动清除。 二级缓存为SessionFactory级别的缓存,要使用第三方二级缓存组件,不同session可以共享二级缓存中的数据! 查询缓存就是hql或sql语句要相同,否则无法命中数据

hibernate 对象是放到哪个缓存

在hibernate中实体类对象有三种状态
(1)瞬时态(临时态)      
瞬时态:即我们自己创建一个对象,还没有保存到数据库就叫临时态,其实也可以说是对像没有id值,跟session没有关系(或者是一级缓存中不存在),即是临时态。
(2)持久态
持久态:即,此对象是我们从数据库中获取到的,即是持久太,简单的说就是,对象有id值,跟session有关系(或者说是一级缓存中存在),即是持久态。
(3)托管态(游离态)
托管态:即,此对象有id值,但是跟session 没有关系(或者说是一级缓存中不存在),即是托管态。
瞬时态———通过保存方法———持久态———通过get()方法———游离态。
其中实体类对象的状态会影响到方法的执行:
就比如saveOrUpdate()方法执行的时候:
(1)对象是瞬时态的话,会执行insert语句。

(2)对像是托管态的时候就会做修改操作(update)
(3)持久态的时候也能做修改操作,但是这里就涉及到持久态对象会在事物的提交的时候自动跟新到数据库。

问候一下hibernate一级缓存他老人家
数据一般是存在数据库里面,而数据库本身是一个文件系统,而文件系统的读取就需要用到文件流了,而读取数据的时候使用文件流的方式操作,效率不是很高的,而考虑到这种情况,我们就可以想想
是不是可以把数据放到系统的内存中去从而提高数据的读取效率,而把数据放到系统的内存中去就是我们所说的缓存数据,即缓存。
那什么是hibernate缓存呢?
那就是hibernate提供了一种优化的方式,可以把数据直接放到内存中,这就是hibernate缓存,其实hibernate一级缓存是hibernate框架中的一种优化的机制。(优化机制我自己的理解就是一种提高程序或者框架性能或者效率的一种“方法”)。
hibernate一级缓存默认是打开的。
hibernate一级缓存有它的使用范围那就是session范围(从session创建到session关闭(事物提交或者手动关闭session)。
一级缓存的道路怎么走
在查询数据库的数据时候,hibernate首先去查的不是数据库,而是一级缓存区域,会先去一级缓存中去查询,如果查询的结果存在那就直接返回不会再去数据库中查询数据,但是如果查询的数据一级缓存中不存在,
那就会去数据库中去查,从数据库中拿到数据之后会同时做两件事那就是把查询的数据返回还有就是把数据放到一级缓存中的缓存区以及快照区中,那我们第二次再次查询这个数据的时候就会直接从缓存中查询就不会进入数据库中进行查询了。
这样就可以减少对数据库的操作,从而达到提高程序的性能以及效率。
一级缓存中的家族产业
一级缓存分为:缓存区和快照区。
缓存区:就比如我们在调用hibernate中的调用方法查询到数据库并拿到了数据库对象的时候,hibernate会首先把查询的数据对象放到一级缓存和快照区中,但是当我们对这个对象我们查询的数据对象进行修改的时候(当然对象必须在存在于Hibernate一级缓存中且session没有关闭的情况下。)我们修改的只是修改缓存区中的内容,而不会修改快照区的内容,这是一个最重要的机制,我感觉这e79fa5e98193e4b893e5b19e31333363393038钟机制真的很牛bi,hibernate只是修改缓存中的数据,而不修改快照区中的内容,但是在提交事物的时候hibernate框架会自动的去拿缓存区和快照区的内容进行对比,如果快照区与缓存区的内容是一致的,那就不会去更新到数据库,但是如果是不一样的那就会自动的更新到数据库。这种机制又是提高Hibernate框架的执行效率。
快照区:快照区,什么是快照区,快照区为什么叫快照区,其实可以这么理解快照区,快照区就是存放照片的,只不过是这个照片有点独特,那就是这个照片是从数据库中拿到的数据的照片。快照区所做的事就是在数据放入缓存区的同时对数据进行“拍照”对其进行记录。以便在以后缓存区中的数据修改的时候进行对比看数据是否发生了变化,如果变化那就更新到数据库,其实到这里也就容易理解为什么我们在修改对象的时候缓存区中的数据会发生相应的改变而快照区不会发生改变了。是因为快照区中存的是“照片”嘛。照片的内容我们是改变不了的。

hibernate的缓存有哪几种?如何使用?

hibernate有session缓存也叫一级缓存(不需要你管)
还有sessionfactory内置缓存(不需要你管)
还有sessionfactory外置缓存也叫二级缓存(默认不启用,想要使用需要在配置文件中配置)
一级和二级缓存都是存放数据库中数据的缓存,sessionfactory内置缓存用来存放映射元数据和预定义的SQL语句

最新文章

随便看看