您当前的位置:首页 > 电脑百科 > 程序开发 > 架构

MyBatis缓存机制

时间:2023-09-12 13:13:56  来源:  作者:Java中文社群

MyBatis 的缓存机制属于本地缓存,适用于单机系统,它的作用是减少数据库的查询次数,提高系统性能。

MyBAIts 中包含两级本地缓存:

  1. 一级缓存:SqlSession 级别的,是 MyBatis 自带的缓存功能,默认开启,并且无法关闭,因此当有两个 SqlSession 访问相同的 SQL 时,一级缓存也不会生效,需要查询两次数据库。
  2. 二级缓存:MApper 级别的,只要是同一个 Mapper,无论使用多少个 SqlSession 来操作,数据都是共享的,多个不同的 SqlSession 可以共用二级缓存,MyBatis 二级缓存默认是关闭的,需要使用时可手动开启,二级缓存也可以使用第三方的缓存,比如,使用 Ehcache 作为二级缓存。

一级缓存 VS 二级缓存

一级缓存和二级缓存的主要区别如下:

  1. 一级缓存是 SqlSession 级别的缓存,它的作用域是同一个 SqlSession,同一个 SqlSession 中的多次查询会共享同一个缓存。二级缓存是 Mapper 级别的缓存,它的作用域是同一个 Mapper,同一个 Mapper 中的多次查询会共享同一个缓存。
  2. 一级缓存是默认开启的,不需要手动配置。二级缓存需要手动配置,需要在 Mapper.xml 文件中添加标签。
  3. 一级缓存的生命周期是和 SqlSession 一样长的,当 SqlSession 关闭时,一级缓存也会被清空。二级缓存的生命周期是和 MapperFactory 一样长的,当应用程序关闭时,二级缓存也会被清空。
  4. 一级缓存只能用于同一个 SqlSession 中的多次查询,不能用于跨 SqlSession 的查询。二级缓存可以用于跨 SqlSession 的查询,多个 SqlSession 可以共享同一个二级缓存。
  5. 一级缓存是线程私有的,不同的 SqlSession 之间的缓存数据不会互相干扰。二级缓存是线程共享的,多个 SqlSession 可以共享同一个二级缓存,需要考虑线程安全问题。

开启二级缓存

MyBatis 一级缓存是自带的缓存,默认开启,且无法关闭。而二级缓存默认是关闭的,因此我们只需要掌握二级缓存的开启即可。二级缓存开启需要两步:

  1. 在 mapper xml 中添加标签。
  2. 在需要缓存的标签上设置 useCache="true"(最新版本中,可以省略此步骤)。

完整示例实现如下:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.mybatis.demo.mapper.StudentMapper">
    <cache/>
    <select id="getStudentCount" resultType="Integer" useCache="true">
        select count(*) from student
    </select>
</mapper>

编写单元测试代码:

import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

@SpringBootTest
class StudentMapperTest {
    @Autowired
    private StudentMapper studentMapper;

    @Test
    void getStudentCount() {
        int count = studentMapper.getStudentCount();
        System.out.println("查询结果:" + count);
        int count2 = studentMapper.getStudentCount();
        System.out.println("查询结果2:" + count2);
    }
}

执行以上单元测试的执行结果如下:



从以上结果可以看出,两次查询虽然使用了不同的 SqlSession,但第二次查询使用了缓存,并未查询数据库。

小结

MyBatis 的缓存机制属于本地缓存,适用于单机系统,它的作用是减少数据库的查询次数,提高系统性能。MyBatis 本地缓存有两类:一级缓存 SqlSession 级别,默认开启不能关闭,二级缓存 Mapper 级别,默认关闭,可以通过在 XML 中添加标签开启。



Tags:MyBatis   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,不构成投资建议。投资者据此操作,风险自担。如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除。
▌相关推荐
MyBatis 的缓存机制属于本地缓存,适用于单机系统,它的作用是减少数据库的查询次数,提高系统性能。MyBaits 中包含两级本地缓存: 一级缓存:SqlSession 级别的,是 MyBatis 自带的缓...【详细内容】
2023-09-12  Tags: MyBatis  点击:(0)  评论:(0)  加入收藏
我无法明确的告诉你JPA和MyBatis在国内哪个会更流行,我本人更喜欢JPA,但是我本人日常开发用MyBatis多。但是我的回答绝对不是在划水,而是我多年来自己的一点小小的思考。MyBati...【详细内容】
2023-08-22  Tags: MyBatis  点击:(25)  评论:(0)  加入收藏
一、场景还原1.版本信息MySQL版本:5.6.36-82.1-logMybatis-Plus的starter版本:3.3.2存储引擎:InnoDB2.死锁现象A同学在生产环境使用了Mybatis-Plus提供的com.baomidou.mybatisp...【详细内容】
2023-08-14  Tags: MyBatis  点击:(12)  评论:(0)  加入收藏
我无法明确的告诉你JPA和MyBatis在国内哪个会更流行,我本人更喜欢JPA,但是我本人日常开发用MyBatis多。但是我的回答绝对不是在划水,而是我多年来自己的一点小小的思考。MyBati...【详细内容】
2023-07-29  Tags: MyBatis  点击:(46)  评论:(0)  加入收藏
最近逛开源社区的时候,偶尔发现了一个 MyBatis 增强框架-MyBatis-Flex ,感觉挺不错的,集合了 MyBatis-Plus、Fluent-MyBatis 的优点。 MyBatis-Flex 的作者是一位技术大佬,还开...【详细内容】
2023-07-27  Tags: MyBatis  点击:(43)  评论:(0)  加入收藏
博主记得在一个周五快下班的下午,产品找到我(为什么总感觉周五快下班就来活...【详细内容】
2023-07-12  Tags: MyBatis  点击:(14)  评论:(0)  加入收藏
MyBatis-Plus则是一个优秀的ORM框架,它为我们封装了大量的数据库操作细节,简化了我们的开发工作,同时也提供了多数据源方案。一、前言随着业务的不断扩展和复杂度的增加,我们在...【详细内容】
2023-06-07  Tags: MyBatis  点击:(99)  评论:(0)  加入收藏
MyBatis是一款优秀的开源持久层框架,支持自定义SQL查询、存储过程和高级映射,相信很多小伙伴都在使用。在MyBatis中,我们可以在XML中编写SQL语句,然后绑定到Java方法中,通过参数...【详细内容】
2023-06-06  Tags: MyBatis  点击:(7362)  评论:(0)  加入收藏
用来循环容器的标签forEach,查看例子foreach元素的属性主要有item,index,collection,open,separator,close。 item:集合中元素迭代时的别名, index:集合中元素迭代时的索引 open:常用...【详细内容】
2023-05-22  Tags: MyBatis  点击:(165)  评论:(0)  加入收藏
MyBatis 是一个优秀的持久层框架,它提供了丰富的 SQL 映射功能,可以让我们通过 XML 或注解方式来定义 SQL 语句。它很大程度上简化了数据库操作,提高了开发效率。动态 SQL 是...【详细内容】
2023-05-12  Tags: MyBatis  点击:(174)  评论:(0)  加入收藏
▌简易百科推荐
在 Spring Boot 中,拦截器和动态代理都是用来实现功能增强的,所以在很多时候,有人会认为拦截器的底层是通过动态代理实现的,所以本文就来盘点一下他们两的区别,以及拦截器的底层...【详细内容】
2023-09-15  Java中文社群  微信公众号  Tags:SpringBoot   点击:(1)  评论:(0)  加入收藏
1 判断类型注入的属性判断其类型: Optional ObjectFactory ObjectProvider javax.inject.Providerpublic class DefaultListableBeanFactory extends AbstractAutowireCapabl...【详细内容】
2023-09-14  Spring全家桶实战案例源码    Tags:Spring   点击:(1)  评论:(0)  加入收藏
RestTemplate是Spring提供的用于访问Rest服务的客户端,RestTemplate提供了多种便捷访问远程Http服务的方法,能够大大提高客户端的编写效率。我之前的HTTP开发是用apache的Htt...【详细内容】
2023-09-14  PlayInJava  今日头条  Tags:Springboot   点击:(4)  评论:(0)  加入收藏
本文目录- 说在前面- 喜马拉雅自研亿级API网关技术实践- 1、第1版:Tomcat NIO+Async Servlet- 2、第2版:Netty+全异步 - 2.1 接入层 - 2.2 业务逻辑层 - 2.3 服务调用层...【详细内容】
2023-09-14  技术老男孩  微信公众号  Tags:架构设计   点击:(0)  评论:(0)  加入收藏
1、含义不同微服务架构是一种将一个单一应用程序开发为一组小型服务的方法,每个服务运行在自己的进程中。分布式系统是若干独立计算机的集合,这些计算机对用户来说就像单个相...【详细内容】
2023-09-13  AI改变你我  微信公众号  Tags:架构   点击:(4)  评论:(0)  加入收藏
分布式锁是一种用于保证分布式系统中多个进程或线程同步访问共享资源的技术。同时它又是面试中的常见问题,所以我们本文就重点来看分布式锁的具体实现(含实现代码)。在分布式系...【详细内容】
2023-09-13  Java中文社群    Tags:分布式锁   点击:(0)  评论:(0)  加入收藏
大家好,我是不才陈某~在排查线上异常的过程中,查询日志总是必不可缺的一部分。现今大多采用的微服务架构,日志被分散在不同的机器上,使得日志的查询变得异常困难。工欲善其事,必...【详细内容】
2023-09-13  码猿技术专栏  微信公众号  Tags:Spring Boot   点击:(5)  评论:(0)  加入收藏
分布式锁是一种用于保证分布式系统中多个进程或线程同步访问共享资源的技术。同时它又是面试中的常见问题,所以我们本文就重点来看分布式锁的具体实现(含实现代码)。在分布式系...【详细内容】
2023-09-13    Java中文社群  Tags:分布式锁   点击:(3)  评论:(0)  加入收藏
作者 | David Linthicum策划 | 言征 从数据可用性、安全性到模型选择和监控,生成式AI的加入便意味着要重新审视云架构。 所以,如果在构建一个云架构同时也在设计生成式AI驱动...【详细内容】
2023-09-13  David Linthicum    Tags:云架构   点击:(3)  评论:(0)  加入收藏
MyBatis 的缓存机制属于本地缓存,适用于单机系统,它的作用是减少数据库的查询次数,提高系统性能。MyBaits 中包含两级本地缓存: 一级缓存:SqlSession 级别的,是 MyBatis 自带的缓...【详细内容】
2023-09-12  Java中文社群    Tags:MyBatis   点击:(0)  评论:(0)  加入收藏
站内最新
站内热门
站内头条