00:00
好,那下面我们来看一下myab里面的二级缓存,Myab的二级缓存呢是circle session factory级别的,而一级缓存大家注意它是circle session级别的啊,然后呢,什么是circle session factory级别的呢?然后通过同一个。Circle session factory所创建的circle session查询的结果会被缓存,也就是说哪怕我们现在呢,然后咱们用的circle session不是同一个,但是你只要来保证咱们当前的circle session factory是同一个circle session factory提供的就可以啊,好,然后但是咱们的二级缓存不像一级缓存那样,它默认开启,咱们的二级缓存呢,它开启是需要有条件的,咱们先来看第一个条件,叫做在核心配置文件中,全局需要设置一个全局配置属性叫做什么呀?开启enabled等于true开启enabled enabled是可用的意思,其实就是开启二级缓存的功能,然后呢,咱们需要把它设置为处,当然它的默认值就是出这个大家可以从咱们的官方文档上去查看一下啊,所以说这个条件咱们不需要手动去设置啊,它默认就是出,但是大家呢,要知道它有这个条件,然后第二个条件是在映射文件中去设置一个标签叫做。
01:17
Catch,那我们下面可以找到咱们的映射文件,然后在这里面呢,去设置一个什么标签叫做catch标签就可以啊,然后再往下咱们的第三个条件呢,大家注意咱们通过测试咱们才能看出来,那下面咱们先把咱们测试的代码来写一下啊。好,然后it test,然后public VO VO。好,然后咱们就叫做test catch OK吧,行括号,大括号,那我们现在要想测试二级缓存,那我们当前要保证咱们所使用的circle session的可以不是同一个,但是呢,我们要保证这个circle session的,然后它一定是由同一个circle session factory所提供的,那我们现在咱们在获取circle session的时候,大家说你还能用工具类吗?不能吧,你在这获取这俩circle session,这行不行不行,为啥它是由同一个circle session factory提供的吗?大家看咱们的工具类,你打开之后,你每调用一次这个方法,那咱们的circle session factory是不是都会重新创建一个,对不对?所以说大家一定要看好,如果大家要想测试二级缓存,那我们就一定不能再使用这个工具类了啊,那我们就需要把咱们当前咱们的circle session factory,咱们再重新获取一次,首先,然后咱们先来获取咱们的核心配置文件所对应的字节输入流,OK。
02:44
好,然后is,然后呢,咱们直接把这个异常给声明出去就行,然后再往下咱们第二步,然后需要去new一个circle session factory builder,通过其中的build方法来使用咱们的核心配置文件所对应的字节输入流,然后就可以来创建一个circle session factory,然后我们既然要测试二级缓存,那咱们就需要通过它来获取什么?需要通过它来获取两个circle session对象啊,你一定要保证他们应该是由同一个circle session factory所获取的啊好,那我们现在获取完成之后,然后下面呢,我们再进行操作circle session1,然后点get map,然后来获取我们当前的catchche catch map的一个代理实现类对象,这是MAP1,然后再来调用我们当前的查询方法,OK,就可以查询出来一个EP对象,然后咱们来看一下啊好,然后下面呢。
03:44
我们再继续往下,咱们把这个来一个复制啊,然后把它给放在啊,应该是把这三行咱们都给它复制一下啊,然后把它放在这儿,那这个时候我们需要用到的circle session是不是应该是circle session2获取的map叫MAP2,然后这呢也是MAP2,然后这个地方2OK啊行,这个大家注意好,那我们现在咱们的这些操作呢,都已经写完了,然后我们在这可以来测试一下,大家看好啊,咱们来一个执行之后大家来看最终的这个结果,咱们主要来看的就是我们当前circle语序,看它执行的几个,大家看一下啊好,然后这个地方有一个circle,然后这个地方也有一个circle口,那有陈老师你不是说的这是测试二级缓存的吗?
04:31
那我们当前查询相同的数据,不是会从咱们的这个缓存里面去获取吗?那为什么现在执行的还是两个SQL呢?大家注意,大家看咱们的第三个条件啊,第三个条件叫做二级缓存必须是在circle session关闭或提交之后有效,那这句话是什么意思呢?就是说我们当前咱们的二级缓存它的范围啊比较大,是circle session factory级别的,而我们当前咱们去查询了一个circle语句之后,咱们当前的这个数据啊,会先被保存到一级缓存中,也就是咱们的circleq session里面,然后,但是呢,我们当前的这个一级缓存中的数据什么时候才会被保存到二级缓存中,大家注意一定是在我们的circle session操作完毕之后,什么叫做操作完毕?就是你的circle session关闭或提交之后,才表示circle session操作完毕了。操作完毕之后,一级缓存中的数据才会被保存到咱们的二级缓存中。
05:31
因为我们当前测试的是二级缓存,对吧?那所以说呢,大家想你在这有没有将circle session1关闭掉,没有,那没有的话,那我们当前的这个数据啊,它还是会被保存到一级缓存中的,会不会保,会不会被保存到二级缓存里面啊,不会,所以说在这咱们需要circle session一点close,好大家注意啊,你只有将circle session关闭之后啊,咱们保存在一级缓存中的数据才会被保存到二级缓存中,OK吧,好,那咱们把这个呢也给它关闭一下,然后点close就可以,好下面我们在这咱们再来一个测试,大家会发现它会报一个错误,报一个什么错呢?大家看一下啊。
06:16
好,然后这个地方给我们报了一个错,报了什么错,然后大家看你看首先咱们第一个扫口语句,它是不是已经获取到了,对吧,已经执行了,然后把咱们需要获取的数据已经查询出来了,但是当我们去执行第二个搜口尾句的时候,然后我们进行第二次查询的时候,它直接就报错了啊为什么报错啊,大家看一下,这个异常叫not serious liable exception,没有序列化的异常,谁没有序列化EP,所以咱们来看文档第四个条件,查询的数据所转换的实体类类型必须实现序列化的接口,所以说问题在哪?咱们当前的EP没有实现序列化的接口,这个大家注意啊,好,那我们现在咱们实现接口之后,我们在这咱们再来一个执行,大家看这个时候啊。
07:07
然后我们当前的circle语句啊,执行的就只有一个了,大家看这是不是一个circle,然后下面咱们在这还有这个circle吗?没有这个警告咱们可以先不管它,大家来看啊,它比较着我们之前咱们测试的一级缓存里面是不是多出来了这样的一句话,叫做catch hit right,大家看一下这叫什么,叫做缓存命中率,叫做缓存命中率,然后这个东西跟我们当前咱们查询的数据的总数量有关系啊,所以说这个大家主要来看一下就行,只要它不是零,那就说明我们当前咱们的缓存被命中了,也就是说我们当前所查询的数据在缓存里面有没有有只有二级缓存才会输出我们当前的缓存命中率的,知道吧,这样的啊,所以说大家一定要看好二级缓存开启的话,它是有条件的,哪几个条件,四个条件啊,首先咱们要来保证你当前你的my be的环境里面,它是支持二级缓存的。也就是说需要配。
08:07
配置一个全局配置叫做catch enabled等于处,然后第二个就是在咱们的映射文件中加上catch标签,第三个就是我们当前的一级,当我们去执行一个查询语句之后。然后我们所查询的数据,它会默认保存在一级缓存中,而我们要想让它保存到二级缓存里面,必须得在circle session关闭或提交之后才有效。还有第四个条件,我们当前所查询出来的数据,所查询的数据所对应的实体内必须实现序列化的接口,OK,是这四个条件啊,好,那我们先把咱们的笔记来写一下,大家注意这个my be的二级缓存,二级缓存好,然后二级缓存的话,大家注意它的二级缓存是什么级别的呀?啊,二级缓存是是circlerc session factory级别的circle session,然后factory级别级别的什么?这又是什么意思?大家注意,即通过同一个circle session factory,然后所获取的什么circle session对象看好了啊。
09:22
然后其通过同一个circle session factory所获取的circle session对象,然后查询的数据会被缓存好,然后再次通过啊,然后同一个circle session factory所获取的circle session对吧?好,然后来查询相同的数据,查询相同的数据然后会从哪来获取啊,会从缓存中获取,哎,行,这个大家注意。好,然后下面呢,我们再来看二级缓存开启是有条件的my be2级缓存开启启的条件好,然后这个条件咱们就直接给大家复制过来了啊,大家注意一有几个条件,一共有四个条件,OK,行,那咱们把它复制过来之后啊,这东西咱们刚才也已经验证过了啊,那下面呢,那大家再来看我们现在还有一个什么问题,那刚才咱们在讲一级缓存的时候。
10:23
咱们说过有四种,有四种情况会使一级缓存失效,那我们当前咱们的二级缓存会失效,不会呢?大家注意会使二级缓存失效的情况只有一个,就是谁呀?就是两次查询之间来执行任意一次增删改,大家注意你的增删改咱们再说一遍,因为它会去更新数据库中的数据。所以说呢,如果你现在。咱们执行的增删改之后,你还从缓存里面去获取的话,那咱们所获取的这个数据啊,对应的数据库里面的数据,是不是很有可能就会被上一次的增删改来进行修改,对不对?所以说呢,这个任意一次增删改不单会来清空一级缓存,二级缓存也是会被清空的。
11:12
但是呢,咱们一级缓存清空的情况,是不是还有一个是手动清空缓存,那大家还记不记得这个。怎么写啊,是circle session.clear catch对不对?然后呢,这一句话会将二级缓存清空吗?大家注意不会,因为大家想想你的clear catch是针对于什么方法使用的,是我们当前咱们的circle session.clear catch,所以说它能清空的只有一级缓存,OK吧,好,这个大家注意,那下面呢,我们来看一下,这个咱们就不做测试了,大家可以自己去测试一下啊。12级缓存失效的情况大家看啊,然后什么情况两次查询之间执行任意的增删改,不单会是一级缓存失效,也会是二级缓存失效,OK吧?行,那这是我们当前的二级缓存的效果,大家一定要注意二级缓存开启的四个条件,OK吧,好啊。
我来说两句