mybatis缓存之二级缓存

西西嘛呦      2022-05-12     480

关键词:

二级缓存(全局缓存):基于namespace级别的缓存,一个namespace对应一个二级缓存。

工作机制:

  • 一个会话,查询一条数据,这条数据会放在当前会话的一级缓存中;
  • 如果会话关闭,该会话对应的一级缓存就消失了;
  • 可以使用二级缓存将保存之前的一级缓存,新的会话要查询相同的信息就可以从二级缓存中获取。

使用过程:

  • 开启二级缓存全局配置;
  • <setting name="cacheEnabled" value="true"/>
  • 在mapper.xml配置使用二级缓存<cache></cache>
  • POJO需要实现序列化接口
<setting name="lazyLoadingEnabled" value="true"/>
<mapper namespace="com.gong.mybatis.dao.EmployeeMapper">
    <cache eviction="FIFO" flushInterval="60000" readOnly="false" size="1024">
        <!-- 
            eviction:缓存的回收策略,默认LRU
            flushInterval:缓存刷新间隔,默认不清空,可以设置一个毫秒值
            readOnly:只读为true,所有从缓存中获取操作都是只读操作,不会修改数据,直接将数据在缓存中的引用交给用户;
                     非只读,获取的数据可能会被修改,会利用序列化&反序列化的技术克隆一份新的数据,安全,但速度慢。
            size:缓存存放多少元素
            type:指定自定义缓存的全类名,实现Cache接口即可
         -->
    </cache>

    ......
</mapper>
public class Employee implements Serializable

测试:

package com.gong.mybatis.test;

import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Test;

import com.gong.mybatis.bean.Department;
import com.gong.mybatis.bean.Employee;
import com.gong.mybatis.dao.EmployeeMapper;
import com.gong.mybatis.mapper.EmployeeMapperDynamicSql;

public class TestMybatis4 {
    
    public SqlSessionFactory getSqlSessionFactory() throws IOException {
        String resource = "mybatis-config.xml";
        InputStream is = Resources.getResourceAsStream(resource);
        return new SqlSessionFactoryBuilder().build(is);
    }

    @Test
    public void test() throws IOException {
        SqlSessionFactory sqlSessionFactory = getSqlSessionFactory();
        SqlSession openSession = sqlSessionFactory.openSession();
        SqlSession openSession2 = sqlSessionFactory.openSession();
        
        try {
            EmployeeMapper mapper = openSession.getMapper(EmployeeMapper.class);
            EmployeeMapper mapper2 = openSession2.getMapper(EmployeeMapper.class);
            Employee em = mapper.getEmpById(1);
            System.out.println(em);
            openSession.close();
            Employee em2 = mapper2.getEmpById(1);
            System.out.println(em2);
            openSession.close();
        } finally {
            // TODO: handle finally clause
            
        }
            
    }
    
}

输出:

DEBUG 01-22 10:59:28,726 Cache Hit Ratio [com.gong.mybatis.dao.EmployeeMapper]: 0.0  (LoggingCache.java:62) 
DEBUG 01-22 10:59:29,055 ==>  Preparing: select id,last_name lastName,email,gender from tbl_employee where id = ?   (BaseJdbcLogger.java:145) 
DEBUG 01-22 10:59:29,102 ==> Parameters: 1(Integer)  (BaseJdbcLogger.java:145) 
DEBUG 01-22 10:59:29,148 <==      Total: 1  (BaseJdbcLogger.java:145) 
Employee [id=1, lastName=dema, gender=1, email=dema@qq.com, dept=null]
DEBUG 01-22 10:59:29,242 Cache Hit Ratio [com.gong.mybatis.dao.EmployeeMapper]: 0.5  (LoggingCache.java:62) 
Employee [id=1, lastName=dema, gender=1, email=dema@qq.com, dept=null]

需要注意是要在第一个会话结束之后要先关闭,否则如果在最后一起关闭,就变成一级缓存的情况了。

和缓存相关的设置:

  • cacheEnabled:true为开启二级缓存
  • 每个select标签都有useCache属性,该属性默认为true,如果置为false,表明不使用二级缓存
  • 每个增删改标签都有flushCache属性,该属性默认为true,执行后清除缓存。(一级缓存、二级缓存都会被清空)
  • 每个select标签也有flushCache属性,默认为false
  • sqlSession.clearCache()只清除一级缓存
  • localCacheScope设置:本地缓存作用域,取SESSION表明一级缓存:当前会话的所有数据保存在会话缓存中。取STATEMENT可以禁用一级缓存。

mybatis从入门到精通—源码剖析之二级缓存细节(代码片段)

⼆级缓存构建在⼀级缓存之上,在收到查询请求时,MyBatis⾸先会查询⼆级缓存,若⼆级缓存未命中,再去查询⼀级缓存,⼀级缓存没有,再查询数据库。⼆级缓存------》⼀级缓存------》数据库与⼀级缓存不同,⼆级缓存和具体... 查看详情

mybatis的缓存机制源码分析之二级缓存解析(代码片段)

引言本篇源码解析基于mybatis3.5.8版本。MyBatis中的缓存指的是MyBatis在执行一次SQL查询时,在满足一定的条件下,会把这个sql和对应的查询结果缓存起来。当再次执行相同SQL语句的时候,就会直接从缓存中进行提取,... 查看详情

mybatis源码分析之06二级缓存

上一篇整合redis框架作为mybatis的二级缓存, 该篇从源码角度去分析mybatis是如何做到的。通过上一篇文章知道,整合redis时需要在FemaleMapper.xml中添加如下配置<cacheeviction="LRU"type="qinfeng.zheng.RedisCache"/> MYBATIS源码分析之02... 查看详情

mybatis之缓存(代码片段)

目录一、简介     PerpetualCache增强的缓存功能分类二、原理1、PerpetualCache源码2、LRUCache,装饰器增强的缓存3、CacheKey4、一级缓存、二级缓存三、一级缓存访问&创建删除四、二级缓存开启命名空间划分访问&更新删除... 查看详情

mybatis之缓存机制

1、缓存机制的简单介绍:    a、MyBatis包含一个非常强大的查询缓存特性,它可以非常方便地配置和定制。缓存可以极大的提升查询效率。        b、MyBatis系统中默认定义了两级缓存:&... 查看详情

mybatis之缓存模块(代码片段)

mybatis之缓存模块mybatis中存在一级(默认开启)、二级缓存。缓存可以加快查询速度,减少连接db的次数。cache模块属于mybatis的基础支持层。位于org.apache.ibatis.cache包下。--------org.apache.ibatis.cache-------------------------------decorators-----... 查看详情

mybatis从入门到放弃六:延迟加载一级缓存二级缓存

...么查询海量数据则又离不开性能,那么这篇中我们就看下mybatis高级应用之延迟加载、一级缓存、二级缓存。使用时需要注意延迟加载必须使用resultMap,resultType不具有延迟加载功能。 一、延迟加载    延迟加载... 查看详情

springboot系列之使用redis做mybatis二级缓存

开发环境JDK1.8SpringBoot2.2.1MybatisPlus3.4.3.4Maven3.2+Mysql5.7.36开发工具IntelliJIDEAsmartGit使用阿里的脚手架,链接:https://start.aliyun.com选择mybatisplusframework然后项目基础架构搭建好之后,加上redis配置<dep 查看详情

mybatis的二级缓存

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

mybatis组件之缓存实现及使用

 一.概述先讲缓存实现,主要是mybatis一级缓存,二级缓存及缓存使用后续补充Mybatis缓存的实现是基于Map的,从缓存里面读写数据是缓存模块的核心基础功能;除核心功能之外,有很多额外的附加功能,如:防止缓存击穿,添... 查看详情

mybatis——一级缓存二级缓存

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

mybatis一级缓存与二级缓存

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

使用redis做mybaties的二级缓存-mybatis二级缓存小心使用

 Mybatis默认对二级缓存是关闭的,一级缓存默认开启;下面就说说为什么使用二级缓存需要注意:    二级缓存是建立在同一个namespace下的,如果对表的操作查询可能有多个namespace,那么得到的数据就是错误的... 查看详情

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

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

23mybatis学习——mybatis的二级缓存

MyBatis一级缓存最大的共享范围就是一个SqlSession内部,那么如果多个SqlSession需要共享缓存,则需要开启二级缓存,开启二级缓存后,会使用CachingExecutor装饰Executor,进入一级缓存的查询流程前,先在CachingExecutor进行二级缓存的查... 查看详情

mybatis缓存

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

mybatis缓存,包含一级缓存与二级缓存,包括ehcache二级缓存

...了提高性能。明白了这一点下面我们开始进入正题。二,mybatis缓存概要①、mybatis的缓存有两种,分别是一级缓存和二级缓存。两者都属于查询缓存,也就是只有执行查询操作的时候才起缓存作用,对于增删改操作无效。②、一... 查看详情

mybatis-一级缓存与二级缓存

 1.1  什么是查询缓存mybatis提供查询缓存,用于减轻数据压力,提高数据库性能。mybaits提供一级缓存,和二级缓存。 一级缓存是SqlSession级别的缓存。在操作数据库时需要构造sqlSession对象,在对象中有一个(内存区... 查看详情