mybatis缓存

一个年轻淫      2022-05-09     194

关键词:

资料来自
一级缓存和二级缓存
一级缓存和二级缓存
注解
mapper

一级缓存
一级缓存,是指SqlSession级别的缓存。一级缓存是一直开启的,在操作数据库时需要构造sqlSession对象,在对象中有一个数据结构(HashMap)用于存储缓存数据。不同的sqlSession之间的缓存数据区域(HashMap)是互相不影响的

public void TestCache01() throws IOException {
    SqlSessionFactory sqlSessionFactory = getSqlSessionFactory();
    SqlSession openSession = sqlSessionFactory.openSession();
    try {
        EmployeeMapper mapper = openSession.getMapper(EmployeeMapper.class);
        Employee emp01 = mapper.getEmpById(1);
        System.out.println(emp01);
        Employee emp02 =mapper.getEmpById(1);
        System.out.println(emp02);

        //从日志中可以看到sql查询只执行了一次,这就是mybatis的一级缓存
        //第二次与第一次查询语句相同,第二次查询返回值直接使用第一次的结果
        //从==判断地址也可以看出
        System.out.println(emp01==emp02);
     }finally {
        openSession.close();
     }
}

一级缓存失效

  • sqlSession不同
  • sqlSession相同,查询条件不同
  • sqlSession相同,两次查询之间执行了增删改操作
  • 如果SqlSession调用了close()方法
  • 如果SqlSession调用了clearCache()

技术图片

二级缓存
二级缓存,是指mapper级别的缓存,多个SqlSession去操作同一个Mapper的sql语句,多个SqlSession可以共用二级缓存,二级缓存是跨SqlSession的,二级缓存默认是不开启的,因为需要配置

技术图片

基本配置步骤

  • 相关的bean需要序列化,为了将缓存数据取出执行反序列化操作,因为二级缓存数据存储介质多种多样,不一定只存在内存中,有可能存在硬盘中,如果我们要再取这个缓存的话,就需要反序列化了,所以mybatis中的pojo都去实现Serializable接口
public class Student implements Serializable {
    private String id;
    private String name;
    private String age;
    private String sex;
    ...
}
  • Mybatis缓存配置
// mybatis-config.xml
<configuration>
    <settings>
        <!-- 开启二级缓存 -->
        <setting name="cacheEnabled" value="true"/>
    </settings>
   ...
</configuration>
  • 注解模式使用
// CacheNamespace这个注解的参数可以自己查看
@CacheNamespace(blocking=true)
public interface UserMapper{
    @Select("select * from t_user where user_id = #{userId}")
    @Options(useCache = true)  // 针对每次查询都需要最新的数据 sql,要设置成 useCache=false,禁用二级缓存
    List<User> getUser(User u);
}
  • mapper模式使用
<?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="cn.mybatis.UserMapper">

? ? // eviction="FIFO"? FIFO(先进先出),LRU(最近使用次数最少的 被优先清除),LFU(最近一段时间内使用次数最少)
? ? // flushInterval="60000"? ? 自动刷新时间60s
? ? // size="512"? ? ?最多缓存512个引用对象
? ? // readOnly="true ?只读
? ? // type?指定自己实现的cache的路径,默认PerpetualCache
    <cache eviction="LRU" />

    // 针对每次查询都需要最新的数据 sql,要设置成 useCache=false,禁用二级缓存
    <select id="selectById" useCache="false">
        select * from test where id = #{id}
    </select >
</mapper>

上面的两个模式都是使用Mybatis默认的缓存类PerpetualCache,但是这个缓存是单服务器工作,无法实现分布式缓存,流行的两个代替默认缓存的插件是,ehcacheredis

如何看出有没有使用缓存
在日记打印区域里,没有执行sql就是调用的缓存

mybatis一级缓存,mybatis二级缓存,mybatis缓存失效(代码片段)

Mybatis一级缓存,Mybatis二级缓存,Mybatis缓存失效 ================================©Copyright蕃薯耀 2021-06-24https://www.cnblogs.com/fanshuyao/ 一、SpringBoot整合Mybatis1、pom.xml引入依赖(基于SpringBoot:2.3.12.REL 查看详情

转mybatis学习总结——mybatis缓存

【转】MyBatis学习总结(七)——Mybatis缓存一、MyBatis缓存介绍  正如大多数持久层框架一样,MyBatis同样提供了一级缓存和二级缓存的支持一级缓存:基于PerpetualCache的HashMap本地缓存,其存储作用域为Session,当Sessionflush或close... 查看详情

mybatis缓存

MyBatis缓存MyBatis缓存分为一级缓存和二级缓存一级缓存MyBatis的一级缓存指的是在一个Session域内,session为关闭的时候执行的查询会根据SQL为key被缓存(跟mysql缓存一样,修改任何参数的值都会导致缓存失效)1)单独使用MyBatis而不继承Spri... 查看详情

mybatis缓存

MyBatis缓存MyBatis包含一个非常强大的查询缓存特性,它可以非常方便地定制和配置缓存。缓存可以极大的提升查询效率。MyBatis系统中默认定义了两级缓存:一级缓存和二级缓存默认情况下,只有一级缓存开启。(SqlSession级别的... 查看详情

mybatis缓存

mybatis的延迟加载和缓存技术开始 mybatis一级缓存  mybatis的二级缓存mybatis默认是没有开启二级缓存的。 开启二级缓存需要在mybatis的全局配置文件sqlMapConfig.xml中加入 除了开启二级缓存开关外,还需要在各自的map... 查看详情

mybatis的二级缓存

文章目录MyBatis的二级缓存MyBatis默认是开启一级缓存的开启MyBatis的二级缓存为什么要开启二级缓存在mybatis的配置文件中进行配置在对应的mapper映射文件中声明相关的DO对象需要实现序列化测试动态代理接口执行更新方法后会清空... 查看详情

mybatis缓存专题-一文彻底搞懂mybatis一级缓存(代码片段)

...不能使用2.什么是一级缓存3.什么情况下会命中一级缓存4.Mybatis的一级缓存机制详解5.MyBatis关闭一级缓存6.Mybatis的一级缓存机制源码分析7.Mybatis的一级缓存机制源码分析图解总结8.一级缓存什么时候被清空?9.一级缓存key是什... 查看详情

mybatis缓存专题-一文彻底搞懂mybatis一级缓存(代码片段)

...不能使用2.什么是一级缓存3.什么情况下会命中一级缓存4.Mybatis的一级缓存机制详解5.MyBatis关闭一级缓存6.Mybatis的一级缓存机制源码分析7.Mybatis的一级缓存机制源码分析图解总结8.一级缓存什么时候被清空?9.一级缓存key是什... 查看详情

mybatis0210mybatis和ehcache缓存框架整合

1.1mybatis和ehcache缓存框架整合一般不用mybatis来管理缓存而是用其他缓存框架在管理缓存,因为其他缓存框架管理缓存会更加高效,因为别人专业做缓存的而mybatis专业做sql语句的,mybatis二级缓存通过ehcache维护缓存数据。1.1.1分布... 查看详情

mybatis缓存机制

mybatis提供了缓存机制减轻数据库压力,提高数据库性能mybatis的缓存分为两级:一级缓存、二级缓存一级缓存是SqlSession级别的缓存,缓存的数据只在SqlSession内有效二级缓存是mapper级别的缓存,同一个namespace公用这一个缓存,所... 查看详情

mybatis一级缓存与二级缓存

MyBatis一级缓存  MyBatis一级缓存默认开启,一级缓存为Session级别的缓存,在执行以下操作时一级缓存会清空  1.执行session.clearCache();  2.执行CUD操作  3.session.close();//不是同一个Session对象了 MyBatis二级缓存  需要配... 查看详情

mybatis缓存

MyBatis的缓存正如大多数持久化框架一样,MyBatis提供了一级缓存和二级缓存的支持。1.一级缓存 一级缓存是基于perpetualCache(MyBatis自带)的HashMap本地缓存,作用范围为session域内,当sessionflush或者close之后,该session中所有的cac... 查看详情

mybatis——一级缓存二级缓存

一、Mybatis缓存●MyBatis包含一个非常强大的查询緩存特性,它可以非常方便地定制和配置缓存。绶存可以极大的提升查询效率。●MyBatis系统中默认定义了两级缓存:一级缓存和二级缓存  ○ 默认情况下,只有一级缓存开启... 查看详情

ssm框架mybatis笔记---表之间的关联关系;mybatis事务;mybatis缓存机制;orm概述

MyBatis框架提供两级缓存,一级缓存和二级缓存,默认开启一级缓存。缓存就是为了提交查询效率MyBatis框架提供两级缓存,一级缓存和二级缓存,默认开启一级缓存。缓存就是为了提交查询效率 查看详情

mybatis三

1Mybatis的缓存1.1Mybatis的缓存机制Mybatis包含非常求昂达的查询缓存特性,它可以非常方便的配置和定制。缓存可以极大的提高查询效率。 Mybatis系统中默认定义了一级缓存和二级缓存。①默认情况下,只有一级缓存开启。②二... 查看详情

《深入理解mybatis原理4》mybatis缓存机制的设计与实现

《深入理解mybatis原理》MyBatis缓存机制的设计与实现本文主要讲解MyBatis非常棒的缓存机制的设计原理,给读者们介绍一下MyBatis的缓存机制的轮廓,然后会分别针对缓存机制中的方方面面展开讨论。MyBatis将数据缓存设计成两级结... 查看详情

mybatis缓存理解

缓存接触过hibernate的同学都知道hibernate中有个二级缓存,mybatis也存在二级缓存。mybatis中二级缓存有什么作用呢?mybatis提供查询缓存,可以提高查询效率,减轻数据库的压力。一级缓存一级缓存是session级别的缓存,基于PerpetualCa... 查看详情

mybatis缓存机制

MyBatis提供了一级缓存和二级缓存的支持。一级缓存一级缓存是基于PerpetualCache的HashMap本地缓存;一级缓存的作用域是SqlSession,即不同的SqlSession使用不同的缓存空间;一级缓存的开启和关闭一级缓存是默认开启的;关闭一级缓存... 查看详情