mybatis框架的分析(三)缓存机制分析

        今天来说一说mybatis的缓存机制吧。mybatis的缓存机制分为一级缓存和二级缓存。我觉得对于mybatis缓存的理解没啥好说的,非常容易理解,我在这里就简述一下吧,先说说一级缓存吧。

一级缓存

        在mybatis中,一级缓存是默认开启的。我们每次对数据库的查询操作都会讲获取到的数据存放到一级缓存中,等到第二次再查询时,会先从缓存中获取数据,如果没有再去数据库中获取,最后在再把数据存储在缓存中。这和hibernate的一级缓存比较类似。mybatis的一级缓存的作用域也是只在一个SqlSession中,不能跨SqlSession共享数据。因此mybatis的一级缓存并不常用,经常用到的是二级缓存。

原理

        mybatis的缓存机制实现原理,上篇文章我对mybatis的Executor执行器进行了分析,了解到mybatis对jdbc的封装是在Executor执行器中进行的。其实今天的缓存依旧离不开执行器,mybatis的一级缓存是通过BaseExecutor中的localCache属性来实现的。这个localCache属性是PerpetualCache类型。PerpetualCache的底层就是HashMap,它对HashMap进行了封装,设计了一个缓存来当做mybatis的一级缓存。如下图:

        这是BaseExecutor实现了Executor接口并引用了PerpetualCache。
在这里插入图片描述
        下图PerpetualCache,实现了mybatis的Cache接口,引用了HashMap并对其进行封装,对外提供getObject和putObject等方法用来操作缓存对象,其实这些缓存对象的实现很简单,我之前写过几篇关于缓存对象的博客,那些就是我参考mybatis的设计来写的。感兴趣的可以看我之前的博客。
在这里插入图片描述

二级缓存

        mybatis的一级缓存十分简单。并且是默认开启的。但是二级缓存是需要我们自己来配置的。先来说一下配置。

开启二级缓存

        想要开启二级缓存有xml配置方式和注解配置两种方式。
        首先说说xml配置方式,只需要在我们的xxxMapper映射文件中添加一个< cache />即可。另外还有一些其他属性设置,如:eviction属性可以修改缓存空间的回收策略,FIFO还是LRU或者是SOFT、flushInterval属性设置缓存刷新的时间间隔、readOnly(只读)属性可以被设置为 true 或 false。默认为false,会以反序列化的形式将数据返回,因此返回的都是新的对象,而如果为true则为只读的缓存,会给所有调用者返回缓 存对象的相同实例。
        再说说注解方式,注解方式更简单,只需要在需要使用二级缓存的mybatis接口上加上@CacheNamespace注解即可。注意:这里的接口是,mybatis在使用mapper动态代理开发的接口。如果是xml和注解混合配置,则需要使用@CacheNamespaceRef注解来映射xml配置文件的命名空间,这个注解的value属性配置xml文件的命名空间。

二级缓存的实现原理

        mybatis的二级缓存开启之后,对数据库的数据操作会先去查询二级缓存,如果没有数据就查询一级缓存,如果一级缓存没有数据就去查询数据库。二级缓存的实现还是离不开Executor这个接口,二级缓存的入口是一个叫CachingExecutor的类,它实现了Executor接口,但是我们在其中并未发现它引用了Cache接口,没有引用Cache接口,它是如何实现二级缓存呢。它实现二级缓存是在方法中引用了Cache接口。同股票MapperStatement来获取Cache对象,如下图:在这里插入图片描述
        在这里,他会判断Cache对象是否为空,如果我们设置了开启二级缓存,那么这里的Cache对象就不会为空。之后会进行一系列操作返回一个list,我们在这里不关注list中存储了什么,这个list最终被存放到了一个叫TransactionalCacheManager中,这个类中通过装饰默认注入了Cache解接口对象。如下图:在这里插入图片描述
        这里可以传入任意接口的实现类来修饰二级缓存的缓存策略。具体策略是一句配置文件来进行的。只要是实现了Cache接口的实现了都可以传入,如下图:
在这里插入图片描述
        mybatis缓存的分析就这么多了,个人觉得mybatis缓存的理解起来其实挺简单的,主要是他的缓存实现类的设计,各种算法,设计模式的运用,这才是其中的妙处。最后还是留下两张图,帮助大家理解。
在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值