首页 > 其他分享 >MyBatis三级缓存详解

MyBatis三级缓存详解

时间:2024-01-18 13:23:28浏览次数:23  
标签:缓存 SqlSession 会话 二级缓存 详解 MyBatis 三级

MyBatis作为一款优秀的持久层框架,在处理数据库操作时提供了丰富的功能,其中之一就是三级缓存。本篇博文将深入介绍MyBatis的三级缓存,通过详细的例子带你了解三级缓存的使用和原理。

背景

MyBatis的三级缓存是指在执行SQL语句时,可以将查询的结果缓存在三个不同的范围内,分别是Local Cache(本地缓存)、SessionFactory Cache(会话工厂缓存)和Second Level Cache(二级缓存)。这样可以提高查询效率,避免重复查询数据库。

三级缓存的配置

在MyBatis配置文件中,可以通过配置来开启或关闭三级缓存。以下是一个简单的配置示例:

<!-- MyBatis配置文件 -->
<configuration>
    <!-- 开启二级缓存 -->
    <settings>
        <setting name="cacheEnabled" value="true"/>
    </settings>

    <!-- 映射文件的配置 -->
    <mappers>
        <!-- 这里配置你的映射文件 -->
    </mappers>
</configuration>

三级缓存的使用

1. 本地缓存(Local Cache)

本地缓存是指在同一个会话中共享的缓存,只在当前会话内有效。以下是一个使用本地缓存的例子:

// 在Mapper接口中配置使用本地缓存
@Mapper
public interface UserMapper {

    // 使用注解开启本地缓存
    @Options(useCache = true)
    @Select("SELECT * FROM users WHERE id = #{id}")
    User getUserById(Long id);
}

在这个例子中,通过@Options(useCache = true)注解开启了本地缓存。

2. 会话工厂缓存(SessionFactory Cache)

会话工厂缓存是指在同一个SqlSessionFactory中共享的缓存,对于多个会话共享。以下是一个使用会话工厂缓存的例子:

// 创建SqlSessionFactory
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

// 创建SqlSession
SqlSession sqlSession = sqlSessionFactory.openSession();

// 获取Mapper接口
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);

// 查询用户
User user = userMapper.getUserById(1L);

// 关闭SqlSession
sqlSession.close();

// 在另一个SqlSession中再次查询相同的用户
SqlSession newSqlSession = sqlSessionFactory.openSession();
User newUser = userMapper.getUserById(1L);

在这个例子中,通过同一个SqlSessionFactory创建的两个SqlSession共享了会话工厂缓存。

3. 二级缓存(Second Level Cache)

二级缓存是指在不同的会话中共享的缓存,对于整个应用程序都有效。以下是一个使用二级缓存的例子:

// 在Mapper接口中配置使用二级缓存
@CacheNamespace
@Mapper
public interface UserMapper {

    @Select("SELECT * FROM users WHERE id = #{id}")
    User getUserById(Long id);
}

在这个例子中,通过@CacheNamespace注解开启了二级缓存。

三级缓存的注意事项

  • 三级缓存默认是开启的,但可以在配置文件中关闭。
  • 二级缓存需要在Mapper接口上使用@CacheNamespace注解开启。
  • 三级缓存对于频繁更新的数据可能会导致缓存不一致,需要慎重使用。

结语

通过本文的详细介绍,你现在应该对MyBatis的三级缓存有了更深入的理解。在实际项目中,根据具体情况合理使用三级缓存,可以有效提升数据库查询性能,提高系统的响应速度。

标签:缓存,SqlSession,会话,二级缓存,详解,MyBatis,三级
From: https://www.cnblogs.com/lyxlucky/p/17972288

相关文章

  • SpringSecurity-认证流程源码级详解
    自定义用户认证逻辑处理用户信息获取逻辑:UserDetailsService处理用户校验逻辑:UserDetails处理密码加密解密:PasswordEncoder认证处理流程以表单认证为例:从发起认证请求到认证过滤器,接着认证成功后,响应从认证过滤器返回的整个过程。SpringSecurity做了什么,设计到了哪些类?他......
  • uni.setStorageSync在登录页面设置缓存,第一次进入首页在onload里面获取不到缓存数据的
    在onLoad里面获取不到缓存:onLoad(option){consttoken=uni.getStorageSync('token');if(!token){uni.showToast({title:"请先登录",icon:"error",......
  • Java异步编程详解
    在现代应用程序开发中,异步编程变得越来越重要,特别是在处理I/O密集型任务时。Java提供了一套强大的异步编程工具,使得开发者能够更有效地处理并发任务。本篇博文将深入探讨Java中异步编程的方方面面,通过具体例子详细说明异步编程的实践。异步编程的背景在传统的同步编程模型中,任务......
  • RocketMQ 中冷热分离的随机索引模块详解
    作者:苏昌盛消息系统中随机索引的特点RocketMQ广泛使用于各类业务场景中,在实际生产场景中,用户通常会选择消息ID或者特定的业务Key(例如学号,订单号)来查询和定位特定的一批消息,进而定位分布式系统中的复杂问题。传统方案下,消息索引的存储是基于数据库系统或者基于本地文件系统实现......
  • vue-element-admin/litemall后端,超过两级嵌套路由无法缓存的问题
    本文主要针对的是litemall后端,vue-element-admin只需稍作修改应该也可以适用。路由扁平的思路主要来源于https://blog.csdn.net/weixin_40119256/article/details/111475571,另外解决面包屑显示问题,此文章作记录以供有需要的同行参考。keep-alive用于缓存不活跃的组件实例,避免重......
  • RocketMQ 中冷热分离的随机索引模块详解
    作者:苏昌盛消息系统中随机索引的特点RocketMQ广泛使用于各类业务场景中,在实际生产场景中,用户通常会选择消息ID或者特定的业务Key(例如学号,订单号)来查询和定位特定的一批消息,进而定位分布式系统中的复杂问题。传统方案下,消息索引的存储是基于数据库系统或者基于本地文件系统实......
  • ETLCloud详解,如何实现最佳实践及问题排查
    ETLCloud介绍ETLCloud是新一代全域数据集成平台,领先于市场同类产品的数据集成平台(DataOps),只需单击几下即可完成数据清洗转换、传输入仓等操作,具备高效、智能、一站式的全域数据集成优势,如:毫秒级实时数据同步支持异构数据源实时数据监听读取,实时数据通过经过清选、转换后可以实时......
  • 分布式缓存(十四)
    单点Redis的问题数据丢失问题;实现Redis数据持久化并发能力问题;搭建主从集群,实现读写分离;存储能力问题;搭建分片集群,利用插槽机制实现动态扩容。故障恢复问题;利用Redis哨兵,实现健康检测和自动恢复;1Redis持久化1.1RDB持久化RDB全称RedisDatabaseBackupfie(Redis数据备份文......
  • Markdown语法详解
    Markdown学习标题:#空格标题名二级标题字体HelloWorld!两边加一个*变成斜体HelloWordl!两边加两个*变成粗体HelloWordl!两边加~~HelloWordl!两边***斜体粗体引用我是一个很牛逼的程序员>空格分割线三个-或者三个*图片!jietu](C:\Users\王牛逼\Deskto......
  • SpringBoot+MybatisPlus+dynamic-datasources实现连接Postgresql和mysql多数据源
    场景dynamic-datasource-spring-boot-starter实现动态数据源Mysql和Sqlserver:https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/117356693SpringBoot中整合MybatisPlus快速实现Mysql增删改查和条件构造器:https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/detail......