Java课题笔记~ MyBatis的缓存机制

面试题:说一说MyBatis的缓存机制?

首先MyBatis设计了二级缓存这样一个机制来提升数据检索效率,避免每一次检索都去查询数据库。

一级缓存是SqlSession级别的缓存,也叫本地缓存。因为每一个用户在执行查询的时候,都需要使用SqlSession来执行,为了避免每一次都去查询数据库,MyBatis把查询出来的数据缓存到SqlSession的本地缓存里面,后续的SQL查询,如果命中缓存的情况下,就可以直接从本地缓存去读取数据。

如果要实现跨SqlSession级别的缓存,那么一级缓存无法做到,因此MyBatis引入了二级缓存的设计。当多个用户查询数据的时候,只要有任何一个SqlSession拿到了数据,就会放到二级缓存里面,其他SqlSession就可以直接从二级缓存里面加载数据。

下面我再来解释一下一二级缓存的实现原理,首先看一级缓存,在SqlSession里面会持有一个Executor,每个Executor里面会有一个LocalCache的对象,当用户发起查询的时候,MyBatis会根据执行语句,在LocalCache里面去查找,如果命中了就只把数据返回,如果没有命中,再去数据库中查找,再写入到LocalCache里面,所以,一级缓存的生命周期是SqlSession.需要注意一点:在多个SqlSession或者分布式环境下,可能会因为一级缓存导致脏读的问题。

而二级缓存的实现原理呢,是在原来的Executor上去做了一个装饰,引入了叫CachingExecutor的装饰器,在进入一级缓存的查询之前,会先通过CachingExecutor进行二级缓存的查询。开启二级缓存之后,会被多个SqlSession共享,因此它是一个全局的缓存,所以它的查询流程就变成了,先去查询二级缓存,再去查询一级缓存,最后再去查数据库。另外,二级缓存相比一级缓存,实现了SqlSession之间的缓存数据的共享,同时缓存粒度可以控制到namespace级别,并且还可以通过Cache接口来实现不同缓存实现类的一个组合,对Cache的可控度也更高了。

你可能感兴趣的:(Java,java,笔记,mybatis,MyBatis的缓存机制)