1. 首页
  2. 编程面试题
  3. Java
  4. Mybatis

Mybatis一级缓存和二级缓存



1、一级缓存: 基于 PerpetualCache 的 HashMap 本地缓存,其存储作用域为 Session,当Session进行flush或close之后,该Session中的所有Cache就将清空,默认打开一级缓存。如下所示:

![](http://www.java1024.cn/doc/offer/images/image-20220211232245131.png)

使用同一个sqlSession对象获取两次UserMapper对象,进行了两次用户数据的查询。控制台的输出结果如下所示:

![](http://www.java1024.cn/doc/offer/images/image-20220211232346445.png)

只执行了一次sql语句。说明第二次查询的时候使用的是缓存数据。

Session里面用HashMap作为缓存对象,一级缓存默认开启,用相同的mapper去查询,只查询一次就是一级缓存

一级缓存是sqlSession范围的缓存,二级缓存可以看作是sqlSessionFactory的缓存,范围更大

2、二级缓存:二级缓存是基于namespace和mapper的作用域起作用的,不是依赖于SQL session,默认也是采用 PerpetualCache,HashMap 存储。如下代码:

![](http://www.java1024.cn/doc/offer/images/image-20220211233858648.png)

当执行完sqlSession1.close()方法时一级缓存就一斤被清空掉了。再次获取了一个新的sqlSession对象,那么此时就需要再次查询数据,因此控制台的输出如下所示:

![](http://www.java1024.cn/doc/offer/images/image-20220211234036227.png)

可以看到进行了两次查询。

默认情况下二级缓存并没有开启,要想使用二级缓存,那么就需要开启二级缓存,如下所示:

① 全局配置文件

![](http://www.java1024.cn/doc/offer/images/image-20220211234211651.png)

② 映射文件

![](http://www.java1024.cn/doc/offer/images/image-20220211234241277.png)

![](http://www.java1024.cn/doc/offer/imgs/image-20220227113723868.png)

运行程序进行测试,控制台输出结果如下所示:

![](http://www.java1024.cn/doc/offer/images/image-20220211234320643.png)

只进行了一次查询,那么就说明数据已经进入到了二级缓存中。

3、对于缓存数据更新机制,当某一个作用域(一级缓存 Session/二级缓存Namespaces)的进行了新增、修改、删除操作后,默认该作用域下所有 select 中的缓存将被 clear。

注意事项:

1、二级缓存需要缓存的数据实现Serializable接口

2、只有会话提交或者关闭以后,一级缓存中的数据才会转移到二级缓存中

3、可自定义存储源,如 Ehcache。

发布者:admin,如若转载,请注明出处:https://ai1024.vip/26520.html

QR code
//