mybatis二级缓存默认开启吗?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mybatis二级缓存默认开启吗?相关的知识,希望对你有一定的参考价值。

参考技术A 不是,一级缓存默认开启,二级需要配置文件设置。

mybatis的一级缓存和二级缓存

一级缓存

一级缓存在mybatis中默认是开启的并且是session级别,它的作用域为一次sqlSession会话。mybatis默认是开启了一级缓存的。

一级缓存的作用域有两种:session(默认)和statment,可通过设置local-cache-scope 的值来切换,默认为session
二者的区别在于session会将缓存作用于同一个sqlSesson,而statment仅针对一次查询,所以,local-cache-scope: statment可以理解为关闭一级缓存。

平时由于使用了数据库连接池,默认每次查询完之后自动commit,这就导致两次查询使用的不是同一个sqlSessioin,根据一级缓存的原理,它将永远不会生效。
当我们开启了事务,两次查询都在同一个sqlSession中,从而让第二次查询命中了一级缓存。

3次查询,其中分页查询2sql,下面两次查询只有一行sql

二级缓存

缓存的优先级
通过mybatis发起的查询,作用顺序为:二级缓存->一级缓存->数据库 ,其中任何一个环节查到不为空的数据,都将直接返回结果
缓存失效
当在一个缓存作用域中发生了updateinsertdelete 动作后,将会触发缓存失效,下一次查询将命中数据库,从而保证不会查到脏数据。

相对于一级缓存,二级缓存的作用域更广泛,它不止局限于一个sqlSession,可以在多个sqlSession之间共享,事实上,它的作用域是namespace(就是多个sqlSession中分多次查询的时候同一个mapper同一个方法参数一样就直接走cache了)。
mybatis的二级缓存默认也是开启的,但由于他的作用域是namespace,所以还需要在mapper.xml中开启才能生效

默认情况下,mybatis打开了二级缓存,但它并未生效,因为二级缓存的作用域是namespace,所以还需要在Mapper.xml文件中配置一下才能使二级缓存生效.

配置二级缓存

二级缓存demo
可以看到在多次查询后,除了分页查询,其他的单次查询都命中了缓存

多表联查二级缓存
接下来演示多表联查的二级缓存
比如有一张user表和user_order表通过id关联
user表left join user_order表 on user.id = user_order.user_id
我们考虑这样一种情况,该联查执行两次,第二次联查前更新user_order表,如果只使用cache配置,将会查不到更新的user_order,因为两个mapper.xml的作用域不同(user只缓存了自己的,所以执行userMapper里的同一个方法相同参数的时候会认为走了缓存,但是其实left join的表已经新插了一条数据),要想合到一个作用域,就需要用到cache-ref

  1. userOrderMapper.xml
<cache></cache>
  1. userMapper.xml
<cache-ref namespace="com.zhengxl.mybatiscache.mapper.UserOrderMapper"/>

首先查询了两次user表,第二次命中二级缓存,然后更新user_order表,使缓存失效,第三次查询时命中数据库。

mybatis默认的session级别一级缓存,由于springboot中默认使用了hikariCP,所以基本没用,需要开启事务才有用。但一级缓存作用域仅限同一sqlSession内,无法感知到其他sqlSession的增删改,所以极易产生脏数据.
二级缓存可通过cache-ref让多个mapper.xml共享同一namespace,从而实现缓存共享,但多表联查时配置略微繁琐。
所以生产环境建议将一级缓存设置为statment级别(即关闭一级缓存),如果有必要,可以开启二级缓存.

如果应用是分布式部署,由于二级缓存存储在本地,必然导致查询出脏数据,所以,分布式部署的应用不建议开启。

参考了大佬的博文
https://www.cnblogs.com/zhengxl5566/p/11868656.html

以上是关于mybatis二级缓存默认开启吗?的主要内容,如果未能解决你的问题,请参考以下文章

mybatis怎么开启二级缓存

MyBatis的二级缓存

SSM-MyBatis-17:Mybatis中二级缓存

Mybatis的一二级缓存,一级缓存默认开启

mybatis开启二级缓存小记

mybatis——一级缓存二级缓存