MyBatis开启二级缓存

news2024/11/15 21:49:22

MyBatis开启二级缓存

前言

MyBatis-Plus(简称MP)是一个基于MyBatis的增强工具,提供了更便捷的CRUD操作和其他功能。与MyBatis相比,MyBatis-Plus并没有引入自己的缓存机制,而是直接使用了MyBatis的缓存机制。

在MyBatis中,缓存分为一级缓存和二级缓存。

一级缓存:一级缓存是SqlSession级别的缓存,它默认是开启的。当查询操作执行时,查询的结果会被缓存在SqlSession的内部数据结构中。如果后续再次执行相同的查询,MyBatis会先检查一级缓存中是否存在结果,如果存在则直接返回缓存的结果,而不会再次执行SQL语句。一级缓存的生命周期与SqlSession相同,当SqlSession关闭时,一级缓存也会被清空。
二级缓存:二级缓存是Mapper级别的缓存,它可以被多个SqlSession共享。当一个查询执行完毕后,查询的结果会被缓存到二级缓存中。当后续其他SqlSession执行相同的查询时,MyBatis会先检查二级缓存中是否存在结果,如果存在则直接返回缓存的结果,而不会再次执行SQL语句。二级缓存的生命周期与应用程序的整个生命周期相同,当应用程序关闭时,二级缓存才会被清空。

Spring Boot 整合Mybatis 开启二级缓存

图片来源与CSDN 半缘修道_半缘君
在这里插入图片描述

在Spring Boot中整合MyBatis,可以通过以下步骤开启二级缓存:

  1. 配置mybatis-config.xml文件:
    在mybatis-config.xml文件中,需要添加如下配置:
<configuration>
  <settings>
    <setting name="cacheEnabled" value="true"/> <!-- 开启二级缓存 -->
    <setting name="lazyLoadingEnabled" value="true"/> <!-- 开启延迟加载 -->
    <setting name="aggressiveLazyLoading" value="false"/> <!-- 关闭积极的延迟加载 -->
  </settings>
  <typeAliases>
    ...
  </typeAliases>
  <mappers>
    ...
  </mappers>
</configuration>
  1. 配置mapper.xml文件:
    在mapper.xml文件中,需要添加如下配置:
<mapper namespace="com.example.mapper.UserMapper">
  <cache/>
  ...
</mapper>
  1. 配置application.properties文件:
    在application.properties文件中,需要添加如下配置:
# 开启MyBatis二级缓存
mybatis.configuration.cache-enabled=true
  1. 配置接口类:
    你还可以通过在mapper接口上添加@CacheNamespace注解来启用并配置二级缓存。例如:
@CacheNamespace
public interface UserMapper {  
    ...  
}

其中,MybatisRedisCache是自定义的缓存实现类,需要继承org.mybatis.caches.redis.RedisCache类,并重写putObjectgetObjectremoveObject方法。

  1. 配置Redis:
    如果使用Redis作为二级缓存的实现,需要在application.properties文件中添加如下配置:
# Redis配置
spring.redis.host=localhost
spring.redis.port=6379
spring.redis.password=
  1. 配置RedisCacheConfiguration:
    在Spring Boot 2.x版本中,还需要配置RedisCacheConfiguration,以便将Redis作为二级缓存的实现。可以通过如下方式进行配置:
@Configuration
@EnableCaching
public class RedisConfig extends CachingConfigurerSupport {
 
    @Bean
    public RedisCacheManager cacheManager(RedisConnectionFactory connectionFactory) {
        RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig()
                .entryTtl(Duration.ofSeconds(360)) // 设置缓存有效期为六分钟
                .disableCachingNullValues() // 禁止缓存null对象
                .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(new GenericJackson2JsonRedisSerializer())); // 使用Jackson2JsonRedisSerializer序列化缓存对象
 
        return RedisCacheManager.builder(connectionFactory)
                .cacheDefaults(config)
                .build();
    }
}

以上就是在Spring Boot中整合MyBatis并开启二级缓存的具体步骤。需要注意的是,在使用二级缓存时,需要考虑缓存的有效期、缓存的清理策略等问题,以免出现脏数据或OOM等问题。

何时使用二级缓存

二级缓存是指在应用程序中使用的缓存层,位于一级缓存(通常是内存)和持久化存储(如数据库)之间。它的作用是提供更高效的数据访问和响应速度,并减轻对持久化存储的压力。下面是一些适合使用二级缓存的场景:

  1. 数据读取频繁但很少发生变化:如果应用程序中有一些数据在读取操作非常频繁,但很少有更新操作,那么使用二级缓存可以大大提高读取性能。这样可以避免频繁地从持久化存储中读取数据,而是将数据缓存在二级缓存中,提供更快的访问速度。

  2. 数据访问开销较高:某些数据的获取过程可能涉及复杂的计算、网络请求或其他开销较高的操作。在这种情况下,通过将结果缓存到二级缓存中,可以避免重复执行这些开销较高的操作,提高系统的响应速度。

  3. 并发读取需求:当多个用户或进程同时读取相同的数据时,使用二级缓存可以减少对持久化存储的并发访问,提高系统的并发读取能力。这样可以避免多个用户同时访问数据库,减少数据库的负载。

  4. 数据共享需求:如果应用程序中的多个模块或服务需要共享相同的数据,使用二级缓存可以实现数据的共享和一致性。通过将数据缓存在二级缓存中,不同的模块或服务可以共享相同的数据,避免了重复查询和数据不一致的问题。

需要注意的是,使用二级缓存也可能带来一些问题,例如缓存一致性、缓存过期和内存管理等。在使用二级缓存时,需要仔细考虑缓存的更新策略、缓存失效机制以及内存消耗等因素,确保缓存数据的正确性和系统的稳定性。

如何解决二级缓存失效

解决二级缓存失效问题的方法之一是使用缓存失效策略和缓存更新机制。下面是一个示例代码,演示了如何使用Spring Cache来处理二级缓存的失效问题。

首先,需要在应用程序中配置缓存管理器和缓存注解支持。可以使用Spring的@EnableCaching注解启用缓存功能,并配置适当的缓存管理器(如Ehcache、Redis等)。以下是一个示例的配置类:

@Configuration
@EnableCaching
public class CacheConfig extends CachingConfigurerSupport {

    @Bean
    public CacheManager cacheManager() {
        // 配置缓存管理器,例如使用Ehcache
        EhCacheCacheManager cacheManager = new EhCacheCacheManager();
        cacheManager.setCacheManager(ehCacheManager());
        return cacheManager;
    }

    @Bean
    public net.sf.ehcache.CacheManager ehCacheManager() {
        // 配置Ehcache缓存管理器
        // ...
    }

    @Override
    public KeyGenerator keyGenerator() {
        // 自定义缓存键生成策略
        return new MyKeyGenerator();
    }
}

接下来,可以在需要缓存的方法上使用Spring的缓存注解,例如@Cacheable@CachePut@CacheEvict。这些注解可以控制缓存的读取、更新和清除操作。以下是一个示例的服务类:

@Service
public class ProductService {

    @Autowired
    private ProductRepository productRepository;

    @Cacheable(value = "products", key = "#id")
    public Product getProductById(Long id) {
        // 从数据库中获取产品
        return productRepository.findById(id);
    }

    @CachePut(value = "products", key = "#product.id")
    public Product saveProduct(Product product) {
        // 保存产品到数据库
        return productRepository.save(product);
    }

    @CacheEvict(value = "products", key = "#id")
    public void deleteProduct(Long id) {
        // 从数据库中删除产品
        productRepository.deleteById(id);
    }
}

在上述示例中,@Cacheable注解表示对应的方法结果会被缓存起来,@CachePut注解表示对应的方法结果会更新缓存,@CacheEvict注解表示对应的方法会清除缓存。通过合理使用这些注解,可以控制缓存的读取、更新和清除操作,从而解决二级缓存失效的问题。

需要注意的是,缓存的失效策略和更新机制应根据具体的业务需求进行设计。例如,可以设置合适的缓存过期时间、缓存更新的触发条件,或者在数据更新时手动清除相关的缓存等。此外,还可以结合消息队列或事件机制,实现异步缓存更新,提高系统的性能和可靠性。

以上示例代码仅供参考,实际应用中需要根据具体情况进行调整和扩展。同时,需要根据具体的缓存框架和技术选型,查阅相关文档以了解更多详细信息。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1144187.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Linux】第五站:Linux权限

文章目录 一、shell命令以及运行原理二、Linux下用户的分类1.root用户和普通用户的切换2.对一条指令的提权 三、什么叫做权限1.权限2.文件的属性3.文件类型4.权限属性 四、更改权限1. chmod 更改文件的属性2. chown 更改拥有者3. chgrp更改所属组4.chown一次性更改拥有者和所属…

12种常见的恶意软件类型与防范建议

1、病毒 病毒是迄今为止最常见的恶意软件类型之一。它是一种能够感染、破坏计算机设备&#xff0c;并在其运行系统上自我复制的程序。由于病毒是自我复制的&#xff0c;一旦安装并运行&#xff0c;它们就可以在同一网络上自动从一台设备传播到另一台设备&#xff0c;无需人为干…

网络(番外篇)can网络知识

通常ECU发出的网络管理报文ID Base Address Node ID Mifa项目向外发的网络管理报文0x418&#xff0c;就是DBC根据基地址加上节点ID定义的。 报文属性是 NmAsrMessage即应答网络报文。 DBC里关于整个网络管理的参数定义&#xff0c;确定好后导入达芬奇&#xff0c;就是直接…

简单的谈谈VPN是什么、类型、使用场景以及工作原理?

作者&#xff1a;久孤776 个人主页&#xff1a;久孤776_python-CSDN博客 作者会持续更新网络知识以及关于python的知识期待你的关注 目录 一、vpn是什么 二、vpn的类型 1. 远程访问VPN 2. 点对点VPN 3. 入口站点VPN 4. 专线VPN 5. 客户端对站点VPN 三、VPN的使用场景 1…

通过python操作neo4j

在neo4j中创建结点和关系 创建结点 创建电影结点 例如&#xff1a;创建一个Movie结点&#xff0c;这个结点上带有三个属性{title:‘The Matrix’, released:1999, tagline:‘Welcome to the Real World’} CREATE (TheMatrix:Movie {title:The Matrix, released:1999, tagl…

从零开始:开发直播商城APP的技术指南

时下&#xff0c;直播商城APP已经成了线上购物、电子商务的核心组成&#xff0c;本文将为您提供一个全面的技术指南&#xff0c;帮助您从零开始开发一个直播商城APP。我们将涵盖所有关键方面&#xff0c;包括技术堆栈、功能模块、用户体验和安全性。 第一部分&#xff1a;技术…

Mybatis的Mapper文件报错:Tag name expected

目录 一、Mapper文件的错误信息 二、原因分析 三、解决方案 1、解决方式一&#xff1a;CDATA 2、解决方式二&#xff1a;预定义字符 一、Mapper文件的错误信息 在使用MyBatis时&#xff0c;我们通常会写一些sql语句。如下图&#xff0c;有时候我们会直接使用比较符号&…

继续畅通工程(最小生成树+并查集)

我刚开始的想法是&#xff0c;既然有已经修好的路&#xff0c;就先把这些修好的路全都加到集合中&#xff0c;即直接把他们Union&#xff0c;不加其长度&#xff0c;然后再将剩下的排序&#xff0c;按Kruskal的算法来进行。 但是这种想法可能有什么问题&#xff0c;只过了一般…

Vscode中不显示.ipynb文件单元格行号

找到设置&#xff0c;搜索line number&#xff1a; 看到下面那个Notebook: Line Numbers 控制单元格编辑器中行号的显示。&#xff0c;选择on即可&#xff1b;

网络原理之TCP/IP

文章目录 应用层传输层UDP协议TCP协议TCP 的工作机制1. 确认应答2. 超时重传3. 连接管理TCP 的建立连接的过程(三次握手),和断开连接的过程(四次挥手)TCP 断开连接, 四次挥手 3. 滑动窗口5. 流量控制6. 拥塞控制7. 延时应答8. 捎带应答9. 面向字节流10. 异常情况 本章节主要讨论…

CRM客户管理系统源码 带移动端APP+H5+小程序

CRM客户管理系统源码 带移动端APPH5小程序 开发环境: thinkphp mysql 功能介绍&#xff1a; 1、 办公管理&#xff1a;审批管理、工作报告、日程管理、办公审批、公告管理 2、 客户管理&#xff1a;我的客户、客户列表、成交客户、行业类别、预查、地区列表、客户状态、客…

嘴笨的技术人员怎么发言

对于嘴笨的人来说&#xff0c;即兴发言简直就是灾难&#xff0c;想想自己窘迫的模样&#xff0c;自己都受不了&#xff0c;但职场又避免不了这种场合&#xff0c;所以&#xff0c;就要靠一些技巧让我们顺利打开思路了。 那么&#xff0c;今天就分享几个解救过我的不同场景即兴发…

【优选算法系列】第一节.滑动窗口(209. 长度最小的子数组和3. 无重复字符的最长子串)

作者简介&#xff1a;大家好&#xff0c;我是未央&#xff1b; 博客首页&#xff1a;未央.303 系列专栏&#xff1a;优选算法系列 每日一句&#xff1a;人的一生&#xff0c;可以有所作为的时机只有一次&#xff0c;那就是现在&#xff01;&#xff01;&#xff01;&#xff01…

结构体指针的引入

概念引入 结构体指针类似于前面学习过的指针&#xff0c;我们先回忆下指针&#xff1a;指针就是地址&#xff0c;指针变量就是存放地址的变量。而结构体也是变量&#xff0c;变量访问有两种方式:1.变量名&#xff0c; 2.地址&#xff0c;之前案例&#xff0c;是用变量名访问。…

rhcsa安装及配置

RHCSA LINUX 所需软件&#xff1a;VmwareWorkStation 16 rhel-baseos-9.0-x86_64-dvd 镜像文件 Xshell 远程终端工具 「链接&#xff1a;https://pan.xunlei.com/s/VNh9sAs1R591Vr2pounMmyyCA1?pwde42h# 提取码&#xff1a;e42h”复制这段内容后打开手机迅雷App&…

某赛驱动器调节工具DM-Series使用笔记

某赛驱动器调节工具DM-Series使用笔记 简介RJ11通讯定义DM-Series界面更改驱动盒的参数观察串口发送出去的数据得出结果CRC参数模型设置电流值与16进制值对照 简介 某赛驱动器的盒调节电流或其他参数。我以DM85x为例&#xff0c;通过串口通讯修改电流值大小&#xff0c;虽然可…

1.Vue—简介、实例与容器、MVVM模型

文章目录 一、Vue简介1.1 特点1.2 搭建Vue开发环境1.2.1 开发版1.2.2 生产版 1.3 下载Vue开发工具1.3.1 GitHub方式1.3.2 国内方式 1.4 消除环境提示 二、 入门程序2.1 HelloWord2.2 分析Hello案例2.3.1 多容器对一实例2.3.2 多实例对应一容器2.3.3 总结 三、MVVM模型 一、Vue简…

C++模板编程和标准模板库(STL)

1、C模板编程 1&#xff09;函数模板 #include <iostream> using namespace std;// 声明一个泛型类型T&#xff0c;参数化数据类型 template <typename T> // 定义一个函数模板 T man(T a, T b) {return (a>b?a:b); }int main() {// 使用的时候没有指定参数类…

matlab中类的分别之handle类和value类——matlab无法修改类属性值的可能原因

写在之前&#xff08;吐槽&#xff09; 最近由于变化了一些工作方向&#xff0c;开始需要使用matlab进行开发&#xff0c;哎哟喂&#xff0c;matlab使用的我想吐&#xff0c;那个matlab编辑器又没代码提示&#xff0c;又没彩色&#xff0c;我只好用vscode进行代码编辑&#xf…

查询和下载国自然科学基金

查询和下载国自然科学基金 打开网站 能够查到基本信息、项目参与人、项目摘要、结题摘要、结题报告、成果统计、成果产出&#xff08;主要为论文&#xff09; 结题报告可以在线阅读。 下面的参考博文中有下载结题报告书的步骤&#xff0c;不过是收费软件。 参考博文 国自…