00:00
好,那我们刚才呢,咱们讲了是my be提一级缓存失效的四种情况,然后下面呢,咱们再来看一下my be的二级缓存啊。那MY的二级缓存的范围呢,要比一级缓存的范围呢要大一些,而且呢,二级缓存是需要手动开启的。首先大家来看二级缓存的范围呢?是circle session factory,那什么叫circle session factory啊?我们在获取circle session的过程中,然后我们是不是先来创建了circle session factory build,然后又来创建了一个circle session factory,那大家说一个circle session factory,这是一个工厂模式,这是一个工厂,那咱们的一个工厂能创建几个circle session的?只能创建一个吗?不是,一个工厂是可以来创建多个circle session的,那所以说我们现在通过这一个工厂所创建的所有的circle session查询的数据都可以被缓存到咱们的二级缓存中,如果说我们现在仍然是通过同一个circle session factory所创建出来的circle session,然后来查询相同数据的时候,就可以从缓存里面去获取。
01:11
这个大家注意啊,好,那我们下面咱们就可以来测试一下,然后咱们的二级缓存,然后是什么样的一个效果,那首先呢,咱们的二级缓存开启的条件呢,一共有四个,首先大家注意咱们的第一个条件是在核心配置文件中来设置咱们的全局配置属性,叫做开启你内部的,也就是二级缓存是否开启这个东西大家不用管它,默认是开启的,默认是true,所以说在这儿呢,大家完全可以不用设置,OK吧,还记不记得全局配置呀,全局配置就是咱们的settings标签中的这个settings标签中进行设置的啊,这个大家注意。好,然后咱们需要在映射文件中去设置咱们的标签,叫做catch。比如说。
02:01
我们当前咱们的映射文件在这儿对吧?然后我们就可以通过咱们的开启标签来开启咱们的二级缓存,大家注意非常简单,你只要把开启,然后来设置一下就可以,当然呢,这里面有关于咱们的二级缓存的一些配置信息,然后这个信息的话,咱们一会儿再看下面,咱们在这有啊,行,然后再往下,二级缓存必须在circle session关闭或提交之后才有效,大家注意什么叫关闭或提交,那我们在进行功能测试的时候,我没有给大家关闭过circle session,但是咱们的circle session里面有这个。Call me的方法大家应该是知道的,对吧?Circle session.call因为我们第一次咱们在测试咱们的MY的功能的时候,我们所创建出来的circle session,它就不会自动提交,对不对?所以说需要我们手动提交好,然后还有一个就是我们的close方法。
03:00
好,这个是来关闭我们当前的s session能看懂吧?好,这个大家注意啊,那所以说我们的二级缓存,什么时候数据才会保存到二级缓存中,大家听好了。在我们没有关闭circle session,然后呢,或者说没有提交circle session的时候,咱们查询的数据会被保存到一级缓存中,当我们关闭或者提交了circle session之后,这个数据才会被保存到二级缓存中,这个大家注意啊,行,那下面呢,我们再往下看,咱们查询的数据所转换的实体类类型必须实现序列化的接口。那我们现在咱们做的例子是不是查询员工信息啊,那员工信息对应的实体类是不是应该是咱们的,谁叫做emmp,那所以咱们在这儿是不是就需要让他去实现implements,然后s liable。能看懂吧,哎,这个大家注意行,那我们现在呢,咱们把这些准备工作呢,咱们都做完了,那我们就可以来测试一下了,大家注意一定要看好我们在这儿,咱们所实现的这个过程啊,一定要满足这些条件,否则的话,咱们的二期缓存是没有效果的啊。
04:11
行,那我们下面咱们再来看,我再写一个方法叫做test。然后public void咱们来访测试一下咱们的一级缓存,咱们就叫做one catch吧,行吧,然后咱们的二级缓存,咱们就叫to catch OK,好,然后设置完成之后,然后大家来看,那我们现在咱们应该怎么写,大家说我们的工具类咱们还能用吗?啊,Circle session you.get circle session这个工具类中的这个方法咱们还能用吗?我鼠标咱们通过CTRL键加鼠标左键点到这个方法里面,大家会发现每当我去调用一次我们的这个方法,那我们的circlel session factory咱们是不是都会创建一个新的呀,对不对?所以说大家一定要看好了,我们当前要想来测试二级缓存,那我们自己所写的这个工具类你一定是不能用的,这个大家注意,所以说我们在这就需要自己把这个过程再重新写一遍,当然呢,咱们也可以再回顾一下,首先第一步大家还记不记得?
05:18
加载咱们的核心配置文件,获取它所对应的字节输入流,叫做resource,然后点get resource as stream,然后把我们核心配置文件的名字给拿过来,那这个时候我们是不是就可以来获取我们的一个字节输入流,然后咱们把咱们的这一个议程呢?咱们给它拆开启一下,能看懂吧。好,然后在这儿的话,咱们是不是要来创建一个circle session factory builder,然后点build方法来创建我们当前的circle session factory这个工厂对象,然后再通过工厂对象咱们来创建我们当前的一个。对吧,Circle session啊,行,大家看好,咱们在这儿来写个true,然后这个是我们创建的第一个,然后下面咱们再来看一下咱们创建的第二个,大家看好了,因为我们要来测试的是circle session factory级别的二级缓存,那所以说咱们现在就通过它来创建两个circle session,哪怕它不是同一个circle session,但是只要是通过同一个circle session factory来获取的,那它就能够从二级缓存中获取数据,OK吧,好啊,行,下面大家再来看circle session一点,叫做get map,然后来获取咱们的开启。
06:39
Map的对象,然后咱们来调用我们的方法叫get e by e,大家看就这个方法点so,咱们直接来输出行,下面是一个一样的过程啊,来,咱们来一个执行,大家看好,这是咱们的CIRCLE2,这个是map,然后呢,呃,然后咱们直接通过MAP2,然后来查询,这是MAP1,这是MAP1。
07:05
大家来看一下有没有写错啊,Circle session1circle session2对吧,这是circle session1map1没问题啊,然后这是CIRCLE2MAP2行就这样就可以,那下面大家说我们当前咱们所设置的这个二级缓存有没有效果呀。应该是没有效果吧,为什么?因为咱们在这个开启二级缓存的条件中,咱们有一个步骤是必须然后等到我们的circle session关闭或提交之后,咱们的二级缓存才会有效,对不对?所以说我们现在咱们来执行了一次,大家来看啊,好,输出的SQ语句一共有几个,首先大家来看这是一个,这下面是不是又是一个,所以说当前咱们的二级缓存有效果吗?没有。为什么?就是因为咱们没有满足条件呀。咱们还有一个条件是要等circle session提交或关闭之后,二级缓存才会有效的,对不对?但是咱们并没有这样去做,所以说二级缓存大家看一下SQ语句输出了几个,两个有没有从缓存里面获取数据,没有是不是好,大家也能够看到,除了我们所输出的SQL语句之外,在这儿还有一个内容叫做缓存命中率,大家注意这个叫做缓存命中率,然后主要指的就是我们当前咱们所查询出来的这一条数据,在我们的缓存里面有没有这种情况。
08:32
大家来看这是不是都是零,那说明啥?说明我们当前通过这一次查询的时候,对吧?然后咱们的缓存里面有没有这条数据啊,没有,然后咱们在查询这条数据的时候,缓存中有没有这条数据也是没有的,所以说我们现在要想来实现效果,大家来看啊,来circle session一点close来把它关闭掉,然后咱们下面这个也是circle session,二点点close把它关闭掉就可以了,那下面咱们再来一个执行,大家来看啊。
09:07
好,大家来看一下,这是我们当前的第一个circle,咱们第二个circle有没有执行啊,没有,为什么?因为我们把circle session给它关闭掉之后,然后我们当前咱们的这个数据就会被保存到二级缓存中,那当我们再次来查询的时候,就可以从二级缓存中来查询到数据了,大家也能够看到它的命中率是不是变了呀,命中率不是零,那就说明我们当前,然后咱们所查询的这条数据在咱们的二级缓存中是有存在于这条数据的,所以说大家来看一下,这就是咱们的二级缓存要符合几个条件。要符合四个条件,第一个条件就是我们必须得在咱们的必须得得到在我们的全局配置中来开启咱们的二级缓存,当然这个是默认的,咱们可以不设置好,然后第二个条件就是我们必须,然后咱们。
10:05
在。来大家来看一下,第二个条件,就在映射文件中,咱们必须要去设置一个catch标签,然后第三个条件呢,就是二级缓存必须在circle session关闭或提交之后才有效,而第四个条件,查询的数据所转换的实体类类型必须实现序列化的接口,这四个条件缺一不可,这个大家注意啊,行,那我们的一级缓存是一级缓存失效的,这个情况呢有四种,那咱们的二级缓存会不会失效呢?大家来看会失效。就比如说二级缓存失效的情况只有一种,就是什么呀?就是我们两次查询之间执行了任意的增删改,大家想一下,因为我们说过你执行了增删改之后,会改变数据库中的数据啊,我们的缓存是为了提高查询效率对不对,但是并不能来改变我们当前查询数据的一个真实性,所以说大家一定要看好了,执行了任意的增删改之后,一级和二级全部都会被清空掉,这个大家注意,那我们的手动清空缓存会清空二级缓存吗?大家想一下,手动清空缓存咱们用的是什么方法?叫circlerc session.clear catch,大家看这是针对于谁的,针对于针对于circlerc session的,那circle session级别的是不是应该是一级缓存呢?所以说在这可catch手动清空缓存,只对一级缓存有效,这个大家注意。
11:37
好OK,那这个是我们当前咱们的这个。是二级缓存失效的,这唯一一种情况其实就是谁呀,就是我们当前咱们两次查询之间执行了任意一次增删改,既会清空一级缓存,又会清空二级缓存,OK吧?好,这个大家可以自己去测试一下,但是这个原理其实咱们想一下就能想明白的,对不对,对吧?好,OK,那这是二级缓存啊。
我来说两句