写点什么

Mybatis 源码学习(二)缓存和别名处理器

  • 2022 年 5 月 15 日
  • 本文字数:1005 字

    阅读完需:约 3 分钟



Mybatis 的一级缓存默认是开启的,并且,是 SqlSession 级别的,在默认情况下,是要是同一个 SqlSession,就会复用相同的缓存,但是在使用flushCache="true"(这个是配置在 SQL 上的)可以在 SQL 执行之前 flush 掉缓存。同时,如果执行了ins **《一线大厂Java面试题解析+后端开发学习笔记+最新架构讲解视频+实战项目源码讲义》无偿开源 威信搜索公众号【编程进阶路】** ertupdatedelete等操作,也会清除一级缓存


重点:一级缓存仅仅是跟 SqlSession 相关的


采坑:一级缓存缓存是查询的结果,如果查询结果是个 POJO,那么千万千万不要修改查询出来的结果,一旦修改了查询结果,那么会导致一级缓存的结果被修改。当然了,关掉解千愁,缓存就用专门的缓存好了,不应该打到数据库的查询就不要打到数据库。一旦查询打到数据库了,就应该明明白白的返回数据库的数据。


[](()二级缓存




Mybatis 的二级缓存默认是关闭的,可以通过配置开启,开启后,还需要在 SQL 上手动设置useCache="true"。二级缓存是 SQLSessionFactory 级别的,同一个 SQLSessionFactory 会使用同一个二级缓存。当然你可以自己实现org.apache.ibatis.cache.Cache然后配置到 xml 里面,这样你就可以接管 Mybatis 的二级缓存了,同样可以打破不同的 SQLSessionFactory 不能共享缓存的限制


[](()缓存总结




关掉解千愁,缓存就用专门的缓存好了,不应该打到数据库的查询就不要打到数据库。一旦查询打到数据库了,就应该明明白白的返回数据库的数据


尤其是分布式环境下,二级缓存非常容易脏读


[](()typeAliases


===========================================================================


这个是用来解析别名的,支持两种方式


<package name="com.xxx"/>


<typeAlias type="com.xxx.A" alias="AC"/>


第二种是直接配置类和别名的对应关系,理解起来也比较简单,但是如果类很多的话,这个配置量会很大


第一种配置方式直接配置 package,程序会自动扫描 package 下的所有类,如果类上有@Alias注解,那就用注解的别名,如果类上没有,那就用类的 SimpleName 作为别名


在做 package 扫描时,主要调用的下面这段代码org.apache.ibatis.type.TypeAliasRegistry#registerAliases



关键代码是resolverUtil.find,我们再往里面看



关键代码是VFS.getInstance().list(path) 这里体现了一个设计模式“单例模式”


[](()VFS 单例




单例一般分为懒汉、饿汉。我之前最常用的方式是用synchronized实现懒汉,但是今天学到了。VFS 的单例是基于静态内部类实现的单例。源码如下:

用户头像

还未添加个人签名 2022.04.13 加入

还未添加个人简介

评论

发布
暂无评论
Mybatis源码学习(二)缓存和别名处理器_程序员_爱好编程进阶_InfoQ写作社区