乐趣区

关于java:面试普通人VS高手系列说一说Mybatis里面的缓存机制

一个工作了 5 年的程序员,在私信外面一直向我诉苦。

他说,他用了 Mybatis 这么久,怎么滴也算是精通 Mybatis 了吧。

后果居然在 Mybatis 这个面试题上翻车了!真的好烦!

好吧,咱们明天来看看“Mybatis 外面的缓存机制”,普通人和高手的答复。

普通人:

嗯。。。。。。。。。

高手:

这个问题,有点简单,我打算从几个方面来阐明。

首先,Mybatis 外面设计了二级缓存来晋升数据的检索效率,防止每次数据的拜访都须要去查询数据库。

一级缓存,是 SqlSession 级别的缓存,也叫本地缓存,因为每个用户在执行查问的时候都须要应用 SqlSession 来执行,

为了防止每次都去查数据库,Mybatis 把查问进去的数据保留到 SqlSession 的本地缓存中,后续的 SQL 如果命中缓存,就能够间接从本地缓存读取了。

如果想要实现跨 SqlSession 级别的缓存?那么一级缓存就无奈实现了,因而在 Mybatis 外面引入了二级缓存,就是当多个用户

在查问数据的时候,只有有任何一个 SqlSession 拿到了数据就会放入到二级缓存外面,其余的 SqlSession 就能够从二级缓存加载数据。

每个一级缓存的具体实现原理是:

在 SqlSession 外面持有一个 Executor,每个 Executor 中有一个 LocalCache 对象。

当用户发动查问的时候,Mybatis 会依据执行语句在 Local Cache 外面查问,如果没命中,再去查询数据库并写入到 LocalCache,否则间接返回。

所以,以及缓存的生命周期是 SqlSessiion,而且在多个 Sqlsession 或者分布式环境下,可能会导致数据库写操作呈现脏数据。

二级缓存的具体实现原理是:

应用 CachingExecutor 装璜了 Executor,所以在进入一级缓存的查问流程之前,会先通过 CachingExecutor 进行二级缓存的查问。

开启二级缓存当前,会被多个 SqlSession 共享,所以它是一个全局缓存。因而它的查问流程是先查二级缓存,再查一级缓存,最初再查数据库。

另外,MyBatis 的二级缓存绝对于一级缓存来说,实现了 SqlSession 之间缓存数据的共享,同时缓存粒度也可能到 namespace 级别,并且还能够通过 Cache 接口实现类不同的组合,对 Cache 的可控性也更强。

以上就是我对这个问题的了解。

总结

在理论业务场景中,多级缓存的设计思维,十分值得咱们学习和借鉴。

所以我认为这个面试题很不错。

大家要牢记,学习底层技术的目标是为了进步技术思维能力和积攒解决方案,为当前更高的职位做好铺垫。

本期的普通人 VS 高手面试系列就到这里完结了。

有任何不懂的技术面试题,欢送随时私信我

版权申明:本博客所有文章除特地申明外,均采纳 CC BY-NC-SA 4.0 许可协定。转载请注明来自 Mic 带你学架构
如果本篇文章对您有帮忙,还请帮忙点个关注和赞,您的保持是我一直创作的能源。欢送关注同名微信公众号获取更多技术干货!

退出移动版