黑马程序员技术交流社区

标题: 【成都校区*Hibernate二级缓存】 [打印本页]

作者: 小蜀哥哥    时间: 2018-5-28 10:57
标题: 【成都校区*Hibernate二级缓存】
本帖最后由 小蜀哥哥 于 2018-5-28 11:27 编辑

Hibernate二级缓存机制
为什么要有缓存
应用程序的数据在缓存均保存在永久介质上,当应用程序需要使用这样的资源时,就需
要从永久介质中获取,在获取的时,需要考虑到cpu,Io,Disk读写等等因素,效率并不优
秀,缓存是存在于永久介质和应用程序中的一片空间,缓存的出现将原来由应用程序直
接和永久介质打交道,转化通过缓存和永久介质打交道,应用程序和缓存打交道,降低
应用程序和永久介质之间数据交互的频率,从而提升应用程序的运行性能

Hibernate中一级缓存缓存的区别
在hibernate中分为一级缓存和二级缓存,其中一级缓存是session级别的缓存,二级缓
存是sessionFacotry级别的缓存,二级缓存弥补一级缓存的不足。一级缓存的数据是针对
单次操作而设计,服务于一次请求操作。由于单次操作的数据量不会涉及很多数据,因
此一级缓存存储数据量较小,生命周期较短。并且单次数据操作完毕后,下一次请求的
数据将无法使用上一次缓存的数据。二级缓存有效弥补一级缓存的缺陷,在现有一级缓
存基础上,在多次请求操作间进行数据共享,有效减少访问永久介质的次数。
且Hibernate的二级缓存缓存是通过外部技术实现的,通过使用不同的缓存供应商提供
的缓,也称作SessionFactory级别缓存存技术,为Hibernate加开一级缓存,可根据需要
进行安装卸载。
Hibernate二级缓存的组成及数据加入
二级缓存由4个区域组成:
1.类对象缓存区
2.类集合缓存区
3.时间戳
4.查询缓存区

什么情况下会影响二级缓存 Get/Load Hql/Sql/QBC都会影响二级缓存

测试的方案(这里以hql为主,QBC,HQL,SQL同理):
1.通过hql查询数据
2.关闭session ,再打开session,重新获得数据
3.如果有数据则证明该数据从二级缓存中获得,而如果没有数据表示hql不会影响二级
缓存
4.测试的结果:是如果采用oid进行查询,可以从二级缓存中获取,而如果进行hql查询,
那么此时不会获得数据:
分析结果:在于hibernate本身不具备分析sql的能力,真正具有分析能力的只是数据库,
针对hql语句,他并不知道你所执行的sql语句真正的含义是什么,所以当你在使用hql语
句时,它只能将数据放入到一级缓存中再将数据加载进入到二级缓存中
测试2:以oid为主的测试,oid的数据都会从从一级缓存中去查询

加入二级缓存的规则:
1.若是通过oid查询‐>会先到session中查询数据,接着如果session中没有数据(有数据则
直接返回),会从二级缓存中获取数据(二级缓存中若有数据会将数据加载进入一级缓存,再
由一级缓存返回数据),若二级缓存中没有数据,会从db中获取数据,db会将数据加载进入到
一级缓存,再同步到二级缓存,再由一级缓存将数据返回

二级缓存对象介绍
1.类对象缓存区:是真正存放数据的地方,所有真实的数据都存放在这个位置,可以说如
果没有这个区域,那么hibernate将无法存储数据,其他的数据都是在为这片区域服务
的,而这片区域中存放的都是散装数据(即非Java对象的数据,是由二级缓存供应商自己
组合的数据)
2.类集合缓存区:该区域存放的是类对象的集合对象,即类对象中存放的是真实数据,但
集合缓存区存放的是类对象中的集合对象的oid
3.时间戳缓存区:因为hibernate并不知道所执行的sql的含义是什么(能识别sql的只有数据
库),当我们使用hibernate的query对象进行update操作的操作时,hibernate并不知道我
们到底修改了什么样的数据,故将我们开始执行这条sql的的时间段的所有数据从二级缓存中
进行销毁
4.查询缓存区:因为hibernate不具备识别SQL/QBC/Hql的能力,所以hibernate不能通过
SQL/QBC/Hql等来加载数据,hibernate为了解决这个问题,创建了一个查询缓存区,类似于
一个map,会将sql为key,以查询结果作为value来进行查询


作者: 酸辣粉    时间: 2018-5-28 11:33
11111111




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2