IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> 详解SpringBoot整合Mybatis开启本地二级缓存和使用redis开启二级缓存 -> 正文阅读

[Java知识库]详解SpringBoot整合Mybatis开启本地二级缓存和使用redis开启二级缓存

作者:%C2%A04%E3%80%81mapper%E6%96%87%E4%BB%B6%E9%85%8D%E7%BD%AE

目录

一、Mybatis缓存

二、mybatis开启本地二级缓存

1、在配置文件中添加以下代码

2、在需要开启的mapper.xml中,添加以下代码(在下方)

3、 mapper查询参数配置

4、启动应用发送查询请求

三、使用redis开启二级缓存

1、在上面基础架构搭建好之后,加上redis maven配置

2、在配置文件中加上redis配置

3、因为这个类不是Spring管理的,所以通过MyBatisRedisSpringContext从ioc容器里获取redisTemplate类

?4、mapper文件配置

?5、启动应用发送请求???????


一、Mybatis缓存

mybatis中有一级缓存和二级缓存,我们常用的是一级缓存,mybatis会默认打开。

  • 一级缓存

一级缓存是SqlSession级别。一级缓存的作用域是 SqlSession , Mabits 默认开启一级缓存。 在同一个SqlSession中,执行相同的SQL查询时;第一次会去查询数据库,并写在缓存中,第二次会直接从缓存中取。 当执行SQL时候两次查询中间发生了增删改的操作,则SqlSession的缓存会被清空。

一级缓存 Mybatis的内部使用一个HashMap,key为hashcode+statementId+sql语句。Value为查询出来的结果集映射成的java对象。 Sqlsession执行insert、update、delete等操作commit后会清空该SqlSession缓存。

  • 二级缓存

二级缓存是Mapper级别的缓存,多个SqlSession去操作同一个Mapper中的sql语句,则这些SqlSession可以共享二级缓存,即二级缓存是跨SqlSession的。简单说就是同一个namespace?下的?mapper?映射文件中,用相同的sql去查询数据,会去对应的二级缓存内取结果。

二、mybatis开启本地二级缓存

1、在配置文件中添加以下代码

# 开启二级缓存

mybatis-plus.configuration.cache-enabled=true

2、在需要开启的mapper.xml中,添加以下代码(在<mapper namespace>下方)

<!--开启二级缓存-->
<cache eviction="FIFO" flushInterval="60000" size="512" readOnly="true"/>

eviction可用的清除策略有:

LRU – 最近最少使用:移除最长时间不被使用的对象。
FIFO – 先进先出:按对象进入缓存的顺序来移除它们。
SOFT – 软引用:基于垃圾回收器状态和软引用规则移除对象。
WEAK – 弱引用:更积极地基于垃圾收集器状态和弱引用规则移除对象。
默认的清除策略是 LRU。

flushInterval(刷新间隔)属性可以被设置为任意的正整数,设置的值应该是一个以毫秒为单位的合理时间量。 默认情况是不设置,也就是没有刷新间隔,缓存仅仅会在调用语句时刷新。

size(引用数目)属性可以被设置为任意正整数,要注意欲缓存对象的大小和运行环境中可用的内存资源。默认值是 1024。

readOnly(只读)属性可以被设置为 true 或 false。只读的缓存会给所有调用者返回缓存对象的相同实例。 因此这些对象不能被修改。这就提供了可观的性能提升。而可读写的缓存会(通过序列化)返回缓存对象的拷贝。 速度上会慢一些,但是更安全,因此默认值是 false。

3、 mapper查询参数配置

 <select id="selectByPrimaryKey" parameterType="java.lang.Long" resultMap="BaseResultMap" useCache="true">
    select 
    <include refid="Base_Column_List" />
    from t_dm_cust
    where id = #{id,jdbcType=BIGINT}
  </select>

设置useCache=false可以禁用当前select语句的二级缓存,即每次查询都会发出sql去查询,默认情况是true,即该sql使用二级缓存。所以:针对每次查询都需要最新的数据sql,要设置成useCache=false,禁用二级缓存。

清空缓存,一般下执行完commit操作都需要刷新缓存,flushCache=true表示刷新缓存,这样可以避免数据库脏读。但是如果你不想刷新缓存只需要这么做:

 <update id="updateByPrimaryKey" parameterType="com.sl.domain.TDmCust" flushCache=false>
    update t_dm_cust
    set create_time = #{createTime,jdbcType=TIMESTAMP}
 where id = #{id,jdbcType=BIGINT}
  </update>

4、启动应用发送查询请求

打开谷歌浏览器发送查询请求时可以看到控制台有sql打印出来。再用IE浏览器发送查询请求发现第二次未打出sql,说明第二次sql查询已经走了mybatis二级缓存。

第一次谷歌浏览器:

?第二次IE浏览器:

Cache Hit Ratio [com.sl.mapper.TDmCustMapper]: 0.5714285714285714

总结:

1、当为select查询语句时:

flushCache默认为false,表示任何时候语句被调用,都不会去清空本地缓存和二级缓存。

useCache默认为true,表示会将本条语句的结果进行二级缓存。

2、当为insert、update、delete语句时:

flushCache默认为true,表示任何时候语句被调用,都会导致本地缓存和二级缓存被清空。

useCache属性在该情况下没有。

三、使用redis开启二级缓存
?

1、在上面基础架构搭建好之后,加上redis maven配置

<dependency>
   <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

2、在配置文件中加上redis配置

spring.redis.host=localhost
spring.redis.port=6379

3、因为这个类不是Spring管理的,所以通过MyBatisRedisSpringContext从ioc容器里获取redisTemplate类

package com.sl.config;

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.DisposableBean;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;

/**
 * @package: com.sl.config
 * @author: shuliangzhao
 * @description:
 * @date 2022/10/4 16:09
 */
@Component
public class MyBatisRedisSpringContext implements ApplicationContextAware, DisposableBean {

   private static ApplicationContext applicationContext = null;

    @Override
    public void destroy() throws Exception {

    }

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        MyBatisRedisSpringContext.applicationContext = applicationContext;
    }

    public static ApplicationContext getApplicationContext() {
        return applicationContext;
    }

    public static <T> T getBean(String name) {
        return (T)applicationContext.getBean(name);
    }

    public static <T> T getBean(Class clz) {
        return (T)applicationContext.getBean(clz);
    }

 }

?4、mapper文件配置

  <cache type="com.sl.cache.MybatisRedisCache" />

?5、启动应用发送请求

第一次谷歌浏览器:

通过sql语句查询数据库,没有走缓存。

?第二次用IE浏览器查询可以看到走了redis缓存。

?总结,以上为两种mybatis二级缓存实现方式,希望能帮到大家。源码请移步mybatis二级缓存

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2022-10-08 20:27:04  更:2022-10-08 20:31:38 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2025年3日历 -2025/3/10 17:10:47-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码