MyBatis(二四):缓存——一级缓存

MyBatis的缓存分为一级缓存和二级缓存。

先看一下MyBatis官方文档给出的说明:

MyBatis 内置了一个强大的事务性查询缓存机制,它可以非常方便地配置和定制。 为了使它更加强大而且易于配置,我们对 MyBatis 3 中的缓存实现进行了许多改进。

默认情况下,只启用了本地的会话缓存,它仅仅对一个会话中的数据进行缓存。 要启用全局的二级缓存,只需要在你的 SQL 映射文件中添加一行:

基本上就是这样。这个简单语句的效果如下:

  • 映射语句文件中的所有 select 语句的结果将会被缓存。
  • 映射语句文件中的所有 insert、update 和 delete 语句会刷新缓存。
  • 缓存会使用最近最少使用算法(LRU, Least Recently Used)算法来清除不需要的缓存。
  • 缓存不会定时进行刷新(也就是说,没有刷新间隔)。
  • 缓存会保存列表或对象(无论查询方法返回哪种)的 1024 个引用。
  • *缓存会被视为读/写缓存,这意味着获取到的对象并不是共享的,可以安全地被调用者修改,而不干扰其他调用者或线程所做的潜在修改。

这里我们来学习一级缓存。

一级缓存也叫本地缓存,是在一次SqlSession会话中产生的缓存,在一次SqlSession会话中查询到的数据存入缓存中,再次执行相同的查询就不需要再从数据库获取数据,而是直接从本地获取。

下面我们用一个实例来说明:

UserMapper接口:

package com.jms.dao;

import com.jms.pojo.User;

public interface UserMapper {
    User getUserById(int id);
}

UserMapper.xml:

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.jms.dao.UserMapper">
    <select id="getUserById" parameterType="_int" resultType="User">
        select * from mybaties.user where id=#{id}
    select>
mapper>

测试:

@Test
    public void getUserById() {
        SqlSession sqlSession = MyBatisUtil.getSqlSession();
        UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
        User user = userMapper.getUserById(10001);
        System.out.println(user);
        System.out.println("=========================================");
        User user2 = userMapper.getUserById(10001);
        System.out.println(user2);
        sqlSession.close();
    }

测试结果:

MyBatis(二四):缓存——一级缓存

可以看见只有第一次查询进入了数据库进行查询,第二次获取相同数据则没有进入数据库查询,是因为它直接从缓存中获取了数据。

明白了一级缓存的使用,那么什么情况下一级缓存会失效呢?

1.不同的SqlSession。一级缓存只在一次SqlSession中生效,不同的SqlSession中相同的查询也无法从缓存中获取。

2.执行增删改语句后,会刷新缓存。增删改有改变数据的可能,缓存的刷新是必然的。

3.使用清除缓存的命令

SqlSession.clearCache();
@Test
    public void getUserById() {
        SqlSession sqlSession = MyBatisUtil.getSqlSession();
        UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
        User user = userMapper.getUserById(10001);
        System.out.println(user);

        sqlSession.clearCache();

        System.out.println("=========================================");
        User user2 = userMapper.getUserById(10001);
        System.out.println(user2);
        sqlSession.close();
    }

MyBatis(二四):缓存——一级缓存

使用清除缓存的语句后,即便查询相同数据也需要再次查询数据库。

(本人仅作个人学习记录用,如有纰漏敬请指正)

Original: https://www.cnblogs.com/jmsstudy/p/16703113.html
Author: 谁知道水烫不烫
Title: MyBatis(二四):缓存——一级缓存

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/616150/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • Linux常用性能诊断命令详解

    top top命令动态地监视进程活动与系统负载等信息。 使用示例: top 效果如下图: 以上命令输出视图中分为两个区域,一个统计信息区,一个进程信息区。 统计信息区: 第一行信息…

    Java 2023年6月7日
    057
  • Word转换HTML(Java实用版)

    前言: 在业务中,如果需要在浏览器中预览Word文档,或者需要将Word文档转成HTML文件保存,那么本章内容,可以帮助到你。 实现这一功能,有多种实现方式,如:docx4j、po…

    Java 2023年6月8日
    066
  • Linux端口映射,80端口映射到8080端口

    iptables -t nat -A PREROUTING -i eth0 -p tcp –dport 80 -j REDIRECT –to-port 8080 其中eth0为…

    Java 2023年6月5日
    091
  • IO流简述

    IO流 1.什么是IO流 ​ java中所有的流都是子java.io下。首先我们看一下什么是IO,I就是Input,O就是Output,也就是输入输入的意思。 这里的输入输入都是相…

    Java 2023年6月9日
    086
  • springbbot 启动流程

    3.9 refreshContext(context); 刷新context 开始执行spring的那一套refresh 但是它稍微重写了context的一些方法 3.9.1 重写…

    Java 2023年6月5日
    090
  • 待学习

    404. 抱歉,您访问的资源不存在。 可能是网址有误,或者对应的内容被删除,或者处于私有状态。 代码改变世界,联系邮箱 contact@cnblogs.com 园子的商业化努力-困…

    Java 2023年6月6日
    084
  • 设计模式学习笔记(十七)中介者模式及其应用场景

    中介者(Mediator)模式指定义了一个单独的中介对象,来封装一组对象之间的交互。即将这组对象之间的交互委派给中介对象,从而来避免对象之间的直接交互。比如我们各种设备之间的通信,…

    Java 2023年6月6日
    087
  • SpringBoot自动配置

    @SpringBootApplication SpringBoot应用标注在某个类上说明这个类是SpringBoot的主配置类,SpringBoot就应该运行这个类的main方法来…

    Java 2023年6月8日
    083
  • 谈谈开发前编程的前置内容

    https://www.cnblogs.com/jingran/articles/15362137.html Original: https://www.cnblogs.com/j…

    Java 2023年6月9日
    084
  • 用font Awesome 制作简单的博客园icon

    其中就有不少Brand Icon 像微信、微博。但是没有在Brand Icon里面找到博客园的Icon。 倒是在Web Application Icons 里找到了 fa-rss-…

    Java 2023年6月5日
    093
  • SpringBoot2.3.12.RELEASE优雅的全局异常处理(模板一)

    参考:https://www.cnblogs.com/xuwujing/p/10933082.html 1、首先,需要引入maven依赖包,如下所示: 1 "1.0&qu…

    Java 2023年5月30日
    084
  • Scanner

    Math:数学类 pow 幂次方计算 字符串连接符 ” “+1+2 = 12 字符串后面都会按照字符串来计算 如果加上括号” “+1…

    Java 2023年6月6日
    073
  • String vs StringBuffer vs StringBuilder

    String vs StringBuffer vs StringBuilder 本文翻译自:https://www.digitalocean.com/community/tutor…

    Java 2023年6月15日
    067
  • Mac MySql版本问题sql_mode=only_full_group_by 的解决方案

    1.切换root,打开配置文件 bash;gutter:true; sh-3.2# vi /etc/my.cnf</p> <pre><code>…

    Java 2023年6月6日
    076
  • 【RocketMQ】msgId与offsetMsgId

    一. 概念 1. msgId(uniqId) 由 producer客户端 生成,调用方法MessageClientIDSetter.createUniqID()生成全局唯一的Id …

    Java 2023年5月29日
    096
  • JDK1.8 StampedLock: 解决ReentrantReadWriteLock在读多写少情况下,写线程饥饿问题

    ReentrantReadWriteLock 在沒有任何读写锁时,才可以取得写入锁,这可用于实现了悲观读取(Pessimistic Reading), 即如果执行中进行读取时,经常…

    Java 2023年5月29日
    0102
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球