00:00
刚才我们举的这个例子呢,实际上是类级别的二级缓存是吧,我们对这个employee做的这个实验。现在我们来说一下集合级别的二级缓存。It。Collection second level page。集合级别的二级和,那么我们先需要获取一个在集合的一个对象department里边有一个employees,我们来获取一个department对象。In a。Department that class。80个部门。反转。改一下这个部门的详细信息。然后呢,再来看一下这个部门里边有多少个员工。
01:03
先跑一下。通过circle我们来看一下目前这个情况哈。先访问的department,然后打了一个sales,在访问的employee,然后打了一个34,这说明什么呀?大家看我这块连连续的set out,但是并不是连续的打印,这说明这个employees用的是延迟加载对吧。好,这边的话呢,我们如法如法炮制,也是先关一个三,再开一个赛。我们把这个代码的话呢,也复制一下。改个名。这个时候我们再看最后语句的感应情况。几条色块一?二三。
02:01
四是不是四条四口啊。为什么呀,因为我们。没有设置对使用二级缓存,也没有设置对department里边这个employees这个集合使用二级缓存,所以说四条。因为中间不是把三声关了吗。现在的话呢,我们来对department跟。Department里边这个employees集合都使用二级缓存,那首先呢,我把这个employee里边配置文件里边的这个catch住掉。配置文件这个的话呢,暂时我先不打开。我们先来设置。这个类使用二级患者。找一个。大家看这时候这四口语句是不是少了,是不是少了一条啊。
03:02
啊,Department只获取了一次,但employee还是两次。下面我们来设置集合级别的二级缓存。Catch。It'right。Collection怎么剪?写department的这个全类名,还有一个属性叫em DS。我们就是通过这样的方式来设置的,这个即可缓存。怎么设呢?全类名。加上一个集合属性名。大家注意一下哈,我现在的话呢,我是设置了department使用二级缓存,Department里边这个集合属性也使用二级缓存,但是我并没有设置集合里边这个元素employee使用二级缓存。这个时候它好用吗?大家觉得好用吗?
04:01
调一下。找一个。看。往上翻。先获取的department没问题,打到sales,再获取这个部门的所有的employee,打到34啊。然后又打了一个sales,为什么呀,因为这个部门不是使用二级缓存了吗?然后我们看部门里边这个集合很明显发circle了,怎么发的。注意employee ID等于什么?是不是拿ID一个一个去获取那个employee啊,这个时候这个词口语就比以前更多了。为什么?看吗?因为这个时候的话呢。我已经对这个集合employees使用了二级缓存,但集合里边的元素没有,它缓存什么了,它缓存了那个ID。
05:03
缓存了员工的一个一个的ID,然后我第二次我在查的时候,他怎么查呀,他用这个ID上数据表里边啊,一个一个去查1EMPLOY,这个时候这个效率比以前比起来实际上更低了。是吧,就是说哎,它缓存了ID,他希望呢,哎,我用这个ID在缓存里边能把这个对象找着没找着,于是的话又去数据库里边一条套查,所以说需要注意的是,我们不但要缓存这个集合。而且还要缓存这个集合里边的人数才可以。快走。色口这个时候的话呢,我们看到只有两条色口。这就是我们说的集合级别的二级缓冲。阅笔记。
06:02
集合级别的二级缓存的配置。第一点配置,对集合使用二级缓存,配置方式呢是这样。You see。全类名加上集合属性名就可以了,那这上边这个对应我们当然也可以在这个原文件里边进行配置。我们可以在这块的话呢。指这个catch,这个catch是针对于这个A的,就我们在前边employ的时候已经看到了,这样配集合级别的呢,在S里边可以来配置一个S,看见了吧。配置方式和上面那个将类似。
07:02
复制一下吧。可以谅解。Lucy。嗯,也可以在打HBM。XR文件中进行配置。那这个里边有一个需要注意的地方,注意什么呀?还需要配置集合中的元数对应。的持久化类也使用二级缓存。否则将会。播出。
08:00
分条。口语。三条四打多的呀。实际上就是我去查集合里边的一个一个对象做出来的是吧?OK,以上这两点呢,就是我们在配置harm集合级别二级缓存的时候需要注意的事项。大家可以来参照一下,最好也来实践一下,下面呢,我们来看一下eh hh的配置文件。就是他。第一个配置项是磁盘的存储路径。大家思考一下哈。为什么就要来配这个磁盘的存储路径呢?我们想这样的一个情境。现在呢,我有大量的数据需要eh k来缓存,那我有可能把这个大量的数据都放在内存里边吗?很显然不能是吧,当这个数据处到一定程度的时候,是不是会比较多的来占用我的系统资源呢?
09:00
所以说我们中间要设设置一个这个临界值,这个临界值之前的啊,我们可以都放在内存里边。超过这个临界值的话,我就得把一部分数据写到磁盘上,那我配置这个路径呢,就是如果我们需要把这个数据写到磁盘上的话,就写到这个里边。这个意思。What it?指定一个目录行E派需要把数据写到硬盘上的话,把数据写到这个目录下。带一个配置项叫什么意思啊?默认的存储策略。这只。设置缓存的默认的数据过期策略啊,默认的配置在这个里面,那有默认的一定也有非默认的。
10:10
就是起名字的。我把中间那段注释我拿掉了哈。这个和这个depot catch啊,看一个这个name属性,这就是带名字的。就看了一个name,这是有名字,这个是没有名字。Edge。设定具体的命名缓存的数据,这策略每个命名缓存代表着一个缓存区域,这个名就代表着一个缓存区域。OK,再看一下这个缓存区域表示什么意思。
11:01
村区域一个具有名称的火冲块。可以给每一个缓存块设置不同的缓存策略,这个是相对于什么呀?就相对于这个默认默认的而言的是吧?如果没有设置任何缓存区域,则所有被缓存对象都使用默认的缓存策略。就是这个default开。那对于我们eh k而言,我们如何来进行命名呢?哎,我们通过以下这样的方式进行命名。他们在不同的缓存区域保存不同的。类和集合于类而言。区域的名称就是全类名。对于迪格而言。名称就是类名加上属姓名。于是我们来搞一下类名。CC。我就可以为这个缓存写这个名字。
12:02
给哪个吧。一刻缓存。又可以来写他。就是我们这块说的这个叫缓存区域,这个缓存区域呢,呃,有了一个name属性,这个主要是跟这个默认的缓存。相区别的。好了,那每一个这个表示什么意思的话呢,这块我们也说清楚了,下边我们要来详细说一下每一个配置项都表示什么意思。第一个内幕属性设置缓存的名字,它的取值为类的全限定类名值类的集合的名字,那集合的名字怎么写啊,也是呃,我的这个全利名,然后点集合。
13:14
点集合属性是吧。下一个应该叫max elements in memory。哎,内存里边最多可以存储对象的数目,我这块的话呢,写的是一放格。下一个internal特指对象在缓存里面是不是永久的。图表是永久的。如果立告是永久的话呢,就表示这个对象这里边是期的,那立告设置为true的话,底下这样两个属性time to I seconds time to leaves就失效了,是吧?默认为false。To,这指对象。
14:00
空闲的最长时间,单位是秒,如果超过这个时间的话,对象过期。过期的话什么意思啊。HK就会把它从缓存中清除。默认是零,表示这个对象可以无限的处于空闲状态。那我们这块的话呢,可以设置一个300秒是吧。Time to live seconds设置对象生存的最长时间,超过这个时间的话,对象过期。如果设置为零,而这个对象可以无限极的存在于缓存中,这个属性值呢,必须大于等于它能理解这个意思吧,这个是空闲时间,而这个是生存的时间,就是说,嗯,比比方说以一个人为例,是吧,说这个人多长时间没工作了?哎,这个时候我们就要警告他说你没工作了,比方说两年。还有一个是人能够活多长?那很明显活的这个年龄肯定是比这个呃,空闲的这个年龄要大的是吧,这就是那叫live second,这个对象在那个eh HK里边最多可以放多长时间。
15:07
而这个是可以斜多长时间,所以说这个值要比这个值要更大,起码要等于它。最后一个配置项,Overflow to disk。设置内存中缓存中对象的数目,如果达到上限后,是否把溢出的写到磁盘上?Overflow to disk超出的写到硬盘上什么意思呢?比方说我们来缓存这个employee。我设置最多可以缓存1万个,那我现在的话呢,我缓存的这个数量超了我达到了10001个,这个时候它就会把一部分数据写到磁盘上,写哪个里边。哎,写到这个里边,我们现在的话呢,就来做一个这样的实验。这个文件夹我改一下,我改成D盘的一个目录。
16:01
一盘我找一下哈。对。这个目录呢,说完了。那下面呢,我想看一下把这个对象写到这个目录上的这个效果还需要设一个什么呀。还需要设一个。我最多,呃,Employee在磁盘上能存多少个吧,我们设为一个。然后的话呢,我来测试这个方法。不是一个employee的一个集合吗?不止一个吧,对吧,跑一下。看一下。没看着文件呢。运行完了。为什么没看着啊,哎,这个eh HK做的挺好的。他在session factory关闭的时候啊,它会把这个文件给清除掉,所以说想看这个效果呢,我们需要在session factory块打一个断点。
17:07
对。OK,我们看到了这样的文件是吧?零个字节真的是零个字节吗?不是的,打开瞧瞧。哎,这里边的确是存储的这个数据是吧,我们这样打开的话呢,是乱码,这个无所谓了,我们只要看到这样的效果就可以了。那这就是我们的这个整个E的配置。下边我们就来说一下,这个叫查询缓存。什么叫查询缓存呢?测试一下。Public voice test query。
18:00
At t。说一个叫查询缓存,比方说我在用HPL进行查询的时候,那我刚才设的这些缓存的这个效果还会起作用吗?还一个query等于section点。B。Employee。List。Employee PS等于query.out em ps.size来一个EPS等于que s。回答一遍,大家说。这个时候我刚才设置的那些缓存那个效果还会起作用吗。跑一个看看。看什么呀?看打了几条色口两条吧,哎。并没有实际上起作用,对吧。
19:02
那。我怎么样让它起作用呢?设置一个查询缓存在。就我们这个query是。可以被缓存的,而且还需要配置启用查询缓存。配置启用查询缓存。He。A。不太走。看都只查了一次啊,这就是我们所谓的查询缓存。做笔记。在来说一下这个eh的配置文件。EH。
20:02
h.XL。每个配置项的话呢,我在这个里边我都已经完整的写了啊,笔记里边的话呢,我就不写了。四说一下大循环之。什么情况情况下。设置的缓存对HQL1QBC查询是。无效。可以通过以辖式。使其是有效的。第一个开启在。Hat配置文件中声明。开启查询缓存声明开启查询缓存。在这。
21:05
C。对。第二个。调用query或。He。Criteria。在的,开着风法带着。方法。That e。过来。这样也是可以的。我们再来看一下这个criteria criteria。等于三升点。
22:01
B。Criteria employee in class。The said。Capable,看见了吧,方法掉的是一样的,那效果也是一样的显示了。就是我们这块说的这个叫查询缓存。那需要注意的是,呃,查询缓存依赖二级缓存。这是一个需要注意的点。三。查询缓存依赖于。二级缓存什么意思啊,就是说你想用查询缓存的话,你必须得先配置harmless的二级缓存才可以。好,OK,我们说了这个查询缓存,前面我们说了,呃,集合缓存还说了。类级别的这个缓存,下面我们来说一下这个时间戳缓存。
23:05
先来看,先来看一部分代码。更新时间戳缓存。Public test。Update stamp。C。叫更新时间戳缓存。把论把这段代码复制过来。C。刚才我们已经测试过了是吧,我设置了它可以使用这个查询缓存搞一搞。这个时候呢,哎,只去获取了一次employee。大家看现在啊。我这两次查询之间,我给某一个employee进行一个更新。
24:03
Employee。等于3.employee。员工100EMPLOYEE点,我给他改为3万。再瞧瞧这个四口语句发送的情况。肯定会有一个update吧,问题是update之后还会有吗?走一个。大家看。先是一个select,然后是一个update,然后又是一个select,诶到后边他怎么就知道再发出一条select呢。这个实际上就是这个更新时间窗缓存,再帮我们进行内部操作看一下。时间戳缓存区域存放了对于查询结果相关的表进行插入、更新或删除操作的时间戳hat通过时间戳缓存区域来判断被缓存的结果是不是过期,运行结果如下。
25:11
首先呢,有两个时刻啊,一个是T1时刻,一个是T2时刻啊,并不是说T1时刻就是先发生的,T2时刻就是后发生的,没有这个意思,T1时刻执行了一个查询,把查询结果放到这个缓冲区域里边了,同时记录该区域的时间戳T1T2时刻对我们刚才这个查询结果的某一条记录进行了一个更新,Harm。把这个T2时刻放到这个,呃,更新时间戳缓存区域里边了。OKT3时刻进行查询,这个T3时刻呀,是T1和T2后边的一个时刻,这个时候我在进行查询的时候,我是用缓存里边的数据呢,还是在发送一条circle呢。我要来看。一时刻跟T2时刻哪个离T3时刻更近一点,如果T1时刻离这个T3时刻要是更近的话。
26:06
这说明我就不用进行查询,我直接用缓存这个数据就可以了。反过来,如果T2时刻离T3时刻更近一点的话,我必须进行查询,因为这个时候这个数据已经不是。最新的了,这就是更新时间窗缓存区域的作用。这个的话呢,我们做一个了解就。可以。最后呢,我们来看一下query接口的特律的方法,那这个方法跟那个二级缓存的这个联系啊,相对而言要紧密一些,如果啊确实是配置了二级缓存,而且刚好使用了二级缓存,它或许会稍微提高一点查询性能,注意我用了一个词啊,就稍微。我们看一下整个运行的这个效果吧。写一个测试方法。East qua literature。
27:02
Three方法。Ear。首先呢。先搞到一个department。20部门。对方学习我们知道是吧,这个80号部门呢,被我们缓存了,部门里边这个集合也被我们缓存了,OK,我来搞一个。B。Employeed e.d pd I。等于。80我就查20号部门用信息,先搞一个listps,等于华点list。eps.size。
28:02
有一个。什么情况开始的话呢,我们查的department。然后查完这个集合,然后我们在做这个HQL查询叫历次方法的时候,这个集合是不是又查了一遍呢?是吧,这个集合又查了一遍。啊,查了这么多字段是吧,同时的话呢,还利用这个反射创建了N多个对象,把这个对象组装到这个集合里边,这是这个list整个的这个流程。这会我们看到我们前边我们用的这个二级缓存,对于这个HQL而言是没用上啊,HQL想用的话,你得用那个查询缓存听清了吧。就是说我们HKL是不走那个二级缓存的,但是你可以用那个查询缓存这块就是一个很好的一个例证哈,好的。
29:02
入教,我们搞E。Employee。MPA等于花蕊点。点em.ne name。找一个。爱看运行效果。是不是连续的打那个名字啊。看思考。开始呢,还是查department,这没问题,他说的employee也没问题。注意后边这个词口语句。发了一个什么呀。这个四个宇宙长的时候是比较短的。他只查了一个ID,看见了吧,哎,这个色口比我们现行那个色口要简单,其一其二,他只查了一个ID,然后怎么办的呢?然后。
30:09
他用这个ID上一级缓存或者二级缓存里面去找,有没有我这个ID对应的对象,如果有的话,直接从缓存里边把那个对象拽出来,如果没有的话,再用这个ID去查。数据库它是这么一个原理,所以说我们这个里边的话呢,我们举了一个极端的例子是吧,刚好我要查的这些对象都在这个二级缓存里边,这个时候的话呢,没有看见去发送。呃,老长那个SQ语句,那这个时候这个效率怎么提升的呢。两点,第一个就是SQ语句简单了,我查的字少了。第二个就是我不用。在我这个内存里面再去生成一批employee对象,然后再装配这个集合了,啊,这是性能提升所在。但是啊,这个仅是满足特定这两个情况下才可以,第一个就是要查,要查到这个数据表里边包含了大量字段,你要是只多只这个多了一个字段或者两个字段的话,我放出一条测口语卷是不是也可以搞出来呀?
31:12
这是一个第二个的话呢,你得保证启用二级缓存,而且这个缓存里边。有很大的可能已经包含了这个对象,你要不包含的话麻烦了。他每次查询都会再单独去发一条色号,比方说这个你感觉70大家看。很可怕。怎么可怕了,他为了得到每一个对象的话,他必须得。Oh。70对吧,他必须得一个一个的去获取我们的employee,这70号部门里面就一个员工,我这样写这个改为80。就改为地势。这个时候你会看见那个宇宙很多。
32:00
直接看这个吧,看N多条语句,都是拿ID去查。In,不一堆下子往前翻。八个班的员工,多哈都是。哎,在这块呢,我先查ID,然后拿拿这个ID上一级库存二级库处找,有没有这个对象,没有好一条一条查。那这个时候的话呢,这就得不偿失了是吧,所以说我们说是稍微提升性能,我们并不建议大家使用这个方法。做一个了解就可以了。
我来说两句