MyBatis

Mybatis缓存

一级缓存

Mybatis的一级缓存是指Session缓存。一级缓存的作用域默认是一个SqlSession。Mybatis默认开启一级缓存。 也就是在同一个SqlSession中,执行相同的查询SQL,第一次会去数据库进行查询,并写到缓存中; 第二次以后是直接去缓存中取。 当执行SQL查询中间发生了增删改的操作,MyBatis会把SqlSession的缓存清空。

image 38

二级缓存

二级缓存
Mybatis的二级缓存是指mapper映射文件。二级缓存的作用域是同一个namespace下的mapper映射文件内容,多个SqlSession共享。Mybatis需要手动设置启动二级缓存。

二级缓存是默认启用的(要生效需要对每个Mapper进行配置),如想取消,则可以通过Mybatis配置文件中的元素下的子元素来指定cacheEnabled为false。

<settings>
  <setting name="cacheEnabled" value="false" />
</settings>

由于是根据namespace来调整的,所以在使用二级缓存时需要修改mapper.xml,开启缓存

image 39

在二级缓存中,mybatis是将类的信息序列化保存在硬盘上,所以映射的类(包括属性类)需要继承序列化。

image 40

效果:

image 41
image 42

Cache Hit Ratio 表示缓存命中率。

开启二级缓存后,每执行一次查询,系统都会计算一次二级缓存的命中率。
第一次查询也是先从缓存中查询,只不过缓存中一定是没有的。
所以会再从DB中查询。由于二级缓存中不存在该数据,所以命中率为0.但第二次查询是从二级缓存中读取的,所以这一次的命中率为1/2=0.5。
当然,若有第三次查询,则命中率为1/3=0.66 。

注意:

增删改操作,无论是否进行提交sqlSession.commit(),均会清空一级、二级缓存,使查询再次从DB中select。

二级缓存的使用原则

只能在一个命名空间下使用二级缓存,由于二级缓存中的数据是基于namespace的,即不同namespace中的数据互不干扰。在多个namespace中若均存在对同一个表的操作,那么这多个namespace中的数据可能就会出现不一致现象。

在单表上使用二级缓存

如果一个表与其它表有关联关系,那么非常有可能存在多个namespace对同一数据的操作。而不同namespace中的数据互补干扰,所以就有可能出现多个namespace中的数据不一致现象。

查询多于修改时使用二级缓存

在查询操作远远多于增删改操作的情况下可以使用二级缓存。因为任何增删改操作都将刷新二级缓存,对二级缓存的频繁刷新将降低系统性能。

发表评论