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

hibernate的缓存有哪几种如何使用 怎么开启hibernate的缓存

2023-05-04 10:51:17 互联网 未知 开发

 hibernate的缓存有哪几种如何使用 怎么开启hibernate的缓存

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

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

怎么开启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的缓存机制谁能详细介绍一下

分一、二两层缓存
所谓的缓存也就是在内存(虚存)中存有一份和数据源相同的数据。

一级缓存:由hibernate管理.虽然提供了几个人为管理的api,但hibernate官方不建意人为参于.在增,删、改的情况下,一级缓存内的数据会和数据源内的数据保持一致.具体怎么保持一致看官方文档
二级缓存:人为管理,可用于分布式架构中,缓存变化少,或是不变化的数据(比如城市信息),可被多会话共享..

Hibernate 缓存有几种

Hibernate的缓存包括Session的缓存和SessionFactory的缓存,其中SessionFactory的缓存又可以分为两类:内置缓存和外置缓存。Session的缓存是内置的,不能被卸载,也被称为Hibernate的第一级缓存。SessionFactory的内置缓存和Session的缓存在实现方式上比较相似,前者是SessionFactory对象的一些集合属性包含的数据,后者是指Session的一些集合属性包含的数据。SessionFactory的内置缓存中存放了映射元数据和预定义SQL语句,映射元数据是映射文件中数据的拷贝,而预定义SQL语句是在Hibernate初始化阶段根据映射元数据推导出来,SessionFactory的内置缓存是只读的,应用程序不能修改缓存中的映射元数据和预定义SQL语句,因此SessionFactory不需要进行内置缓存与映射文件的同步。SessionFactory的外置缓存是一个可配置的插件。在默认情况下,SessionFactory不会启用这个插件。外置缓存的数据是数据库数据的拷贝,外置缓存的介质可以是内存或者硬盘。SessionFactory的外置缓存也被称为Hibernate的第二级缓存。

Hibernate的缓存技术有哪些

缓存是数据库数据在内存中的临时容器,它包含了库表数据在内存中的临时拷贝,位于数据库与应用程序之间,其作用是为了降低应用程序对物理数据源访问的频次,从而提高应用的运行性能。

Hibernate的缓存机制

1.1持久化层的缓存的范围

持久层设计中,往往需要考虑几个不同层次中的数据缓存策略。这些层次的划分标准针对不同情况有所差异,一般而言,ORM的数据缓存应包含如下几个层次:

事务级缓存(Transaction Layer Cache)

缓存只能被当前事务访问。缓存的生命周期依赖于事务的生命周期,当事务结束时,缓存也就结束生命周期。在此范围下,缓存的介质是内存。事务可以是数据库事务或者应用事务,每个事务都有独自的缓存,缓存内的数据通常采用相互关联的对象形式。

应用级/进程级缓存(Application/Process Layer Cache)

缓存被进程内的所有事务共享。这些事务有可能是并发访问缓存,因此必须对缓存采取必要的事务隔离机制。缓存的生命周期依赖于进程的生命周期,进程结束时,缓存也就结束了生命周期。进程范围的缓存可能会存放大量的数据,所以存放的介质可以是内存或硬盘。缓存内的数据既可以是相互关联的对象形式也可以是对象的松散数据形式。对象的松散数据形式有点类似于对象的序列化数据,但是对象分解为松散的算法比对象序列化的算法要求更快。

集群级缓存(Cluster Layer Cache)

在集群环境中,缓存被一个机器或者多个机器的进程共享。缓存中的数据被复制到集群环境中的每个进程节点,进程间通过远程通信来保证缓存中的数据的一致性,缓存中的数据通常采用对象的松散数据形式。对大多数应用来说,应该慎重地考虑是否需要使用集群范围的缓存,因为访问的速度不一定会比直接访问数据库数据的速度快多少。

持久层提供以上多种层次的缓存。如果在事务级缓存中没有查到相应的数据,还可以到进程级或集群级缓存内查询,如果还是没有查到,那么只有到数据库中查询。事务级缓存是持久化层的第一级缓存,通常它是必需的进程级或集群级缓存是持久化层的第二级缓存,通常是可选的。

1.2 hibernate缓存机制

Hibernate提供了两种缓存,第一种是Session的缓存,又称为一级缓存。由于Session对象的生命周期通常对应一个数据库事务或者一个应用事务,因此它的缓存是事务范围的缓存。第一级缓存是必需的,不允许而且事实上也无法卸除。在第一级缓存中,持久化类的每个实例都具有唯一的OID。

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框架的执行效率。
快照区:快照区,什么是快照区,快照区为什么叫快照区,其实可以这么理解快照区,快照区就是存放照片的,只不过是这个照片有点独特,那就是这个照片是从数据库中拿到的数据的照片。快照区所做的事就是在数据放入缓存区的同时对数据进行“拍照”对其进行记录。以便在以后缓存区中的数据修改的时候进行对比看数据是否发生了变化,如果变化那就更新到数据库,其实到这里也就容易理解为什么我们在修改对象的时候缓存区中的数据会发生相应的改变而快照区不会发生改变了。是因为快照区中存的是“照片”嘛。照片的内容我们是改变不了的。

最新文章