Mybatis缓存处理机制
一、MyBatis缓存介绍
正如大多数持久层框架一样,MyBatis 同样提供了一级缓存和二级缓存的支持
- 一级缓存: 基于PerpetualCache 的 HashMap本地缓存,其存储作用域为 Session,当 Session flush 或 close 之后,该Session中的所有 Cache 就将清空。
2. 二级缓存与一级缓存其机制相同,默认也是采用 PerpetualCache,HashMap存储,不同在于其存储作用域为 Mapper(Namespace),并且可自定义存储源,如 Ehcache。
3. 对于缓存数据更新机制,当某一个作用域(一级缓存Session/二级缓存Namespaces)的进行了 C/U/D 操作后,默认该作用域下所有 select 中的缓存将被clear。
1.1、Mybatis一级缓存测试

package me.Isaac.test; import me.Isaac.domain.User;
import me.Isaac.util.MyBatisUtil;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test; /**
* @author Isaac
* 测试一级缓存
*/
public class TestOneLevelCache { /*
* 一级缓存: 也就Session级的缓存(默认开启)
*/
@Test
public void testCache1() {
SqlSession session = MyBatisUtil.getSqlSession();
String statement = "me.Isaac.mapping.userMapper.getUser";
User user = session.selectOne(statement, 1);
System.out.println(user); /*
* 一级缓存默认就会被使用
*/
user = session.selectOne(statement, 1);
System.out.println(user);
session.close();
/*
1. 必须是同一个Session,如果session对象已经close()过了就不可能用了
*/
session = MyBatisUtil.getSqlSession();
user = session.selectOne(statement, 1);
System.out.println(user); /*
2. 查询条件是一样的
*/
user = session.selectOne(statement, 2);
System.out.println(user); /*
3. 没有执行过session.clearCache()清理缓存
*/
//session.clearCache();
user = session.selectOne(statement, 2);
System.out.println(user); /*
4. 没有执行过增删改的操作(这些操作都会清理缓存)
*/
session.update("me.Isaac.mapping.userMapper.updateUser",
new User(2, "user", 23));
user = session.selectOne(statement, 2);
System.out.println(user); }
}

1.2、Mybatis二级缓存测试
1、开启二级缓存,在userMapper.xml文件中添加如下配置
<mapper namespace="me.Isaac.mapping.userMapper">
<!-- 开启二级缓存 -->
<cache/>
2、测试二级缓存

package me.Isaac.test; import me.Isaac.domain.User;
import me.Isaac.util.MyBatisUtil;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.junit.Test; /**
* @author Isaac
* 测试二级缓存
*/
public class TestTwoLevelCache { /*
* 测试二级缓存
* 使用两个不同的SqlSession对象去执行相同查询条件的查询,第二次查询时不会再发送SQL语句,而是直接从缓存中取出数据
*/
@Test
public void testCache2() {
String statement = "me.Isaac.mapping.userMapper.getUser";
SqlSessionFactory factory = MyBatisUtil.getSqlSessionFactory();
//开启两个不同的SqlSession
SqlSession session1 = factory.openSession();
SqlSession session2 = factory.openSession();
//使用二级缓存时,User类必须实现一个Serializable接口===> User implements Serializable
User user = session1.selectOne(statement, 1);
session1.commit();//二级缓存是从cache(mapper.xml中定义的cache)中取得,如果session不commit,那么,数据就不会放入cache中。所以,只有commit后,才能取得
System.out.println("user="+user); //由于使用的是两个不同的SqlSession对象,所以即使查询条件相同,一级缓存也不会开启使用
user = session2.selectOne(statement, 1);
//session2.commit();
System.out.println("user2="+user);
}
}

1.3、二级缓存补充说明
1. 映射语句文件中的所有select语句将会被缓存。
2. 映射语句文件中的所有insert,update和delete语句会刷新缓存。
3. 缓存会使用Least Recently Used(LRU,最近最少使用的)算法来收回。
4. 缓存会根据指定的时间间隔来刷新。
5. 缓存会存储1024个对象
cache标签常用属性:
<cache
eviction="FIFO" <!--回收策略为先进先出-->
flushInterval="60000" <!--自动刷新时间60s-->
size="512" <!--最多缓存512个引用对象-->
readOnly="true"/> <!--只读-->
本代码参考自:http://www.cnblogs.com/xdp-gacl/p/4270403.html
测试完全可用。
Mybatis缓存处理机制的更多相关文章
- 【转】MaBatis学习---源码分析MyBatis缓存原理
[原文]https://www.toutiao.com/i6594029178964673027/ 源码分析MyBatis缓存原理 1.简介 在 Web 应用中,缓存是必不可少的组件.通常我们都会用 ...
- mybatis缓存机制
目录 mybatis缓存机制 Executor和缓存 一级缓存 小结 二级缓存 小结 mybatis缓存机制 mybatis支持一.二级缓存来提高查询效率,能够正确的使用缓存的前提是熟悉mybatis ...
- 聊聊MyBatis缓存机制【美团-推荐】
聊聊MyBatis缓存机制 2018年01月19日 作者: 凯伦 文章链接 18778字 38分钟阅读 前言 MyBatis是常见的Java数据库访问层框架.在日常工作中,开发人员多数情况下是使用My ...
- 《深入理解mybatis原理4》 MyBatis缓存机制的设计与实现
<深入理解mybatis原理> MyBatis缓存机制的设计与实现 本文主要讲解MyBatis非常棒的缓存机制的设计原理,给读者们介绍一下MyBatis的缓存机制的轮廓,然后会分别针对缓存 ...
- Mybatis缓存机制及mybatis的各个组成部分
Mybatis 一级缓存: 基于PerpetualCache 的 HashMap本地缓存,其存储作用域为 Session,当 Session flush 或 close 之后,该Session中的所有 ...
- 分享知识-快乐自己:Mybatis缓存机制
论缓存机制: 1):mybatis 提供了缓存机制减轻数据库压力,提高数据库性能. 2):mybatis 的缓存分为两级:一级缓存.二级缓存 3):一级缓存是SqlSession级别的缓存,缓存的数据 ...
- 聊聊MyBatis缓存机制
https://tech.meituan.com/mybatis_cache.html 前言 MyBatis是常见的Java数据库访问层框架.在日常工作中,开发人员多数情况下是使用MyBatis的默认 ...
- Spring Boot2(二):使用Spring Boot2集成Mybatis缓存机制
前言 学习SpringBoot集成Mybatis的第二章,了解到Mybatis自带的缓存机制,在部署的时候踩过了一些坑.在此记录和分享一下Mybatis的缓存作用. 本文章的源码再文章末尾 什么是查询 ...
- 【转】MyBatis缓存机制
转载:https://blog.csdn.net/bjweimengshu/article/details/79988252. 本文转载自公众号 美团技术点评 前言 MyBatis是常见的Java数据 ...
随机推荐
- 开源实时日志分析ELK平台部署
参考帖子: (1)自动化测试Web服务器性能autobench+httperf
- 无法启动"D\projects\hello\Debug\hello.exe" 系统找不到指定的文件。[LINK : fatal error LNK1123: 转换到 COFF 期间失败: 文件无效或损坏]
这两天安装Visual Studio遇到这样的一个问题,用自己的电脑和公司的电脑都出现同样的问题.两台电脑都是新系统,按理来说是没有问题的.但是一出现问题,对于我这个小白来说,还是耗费了挺多精力都无果 ...
- C Primer Plus_第10章_数组和指针_编程练习
1. /*rain.c 针对若干年的降水量数据,计算年降水总量.年降水平均量,以及月降水平均量*/ #include <stdio.h> #define MONTHS 12 #define ...
- oracle数据库创建后要做的事情
在SQL Plus工具中(oracle自带)用conn /as sysdba登录数据库. 一:先新建用户 create user test01 identified by test02(test01为 ...
- 常用CSS居中
1.flex方法: .center_fix { display:flex; align-items:center; justify-content: center; } 具体flex方法教程:可以参见 ...
- PHP无限极分类
当你学习php无限极分类的时候,大家都觉得一个字“难”我也觉得很难,所以,现在都还在看,因为工作要用到,所以,就必须得研究研究. 到网上一搜php无限极分类,很多,但好多都是一个,并且,写的很乱, ...
- Webkit 文字和背景效果
-webkit-background-clip:padding-box | border-box | content-box | text,指定对象的背景图像向外裁剪的区域.对应的脚本特性为backg ...
- Codeforces444C DZY Loves Colors(线段树)
题目 Source http://codeforces.com/problemset/problem/444/C Description DZY loves colors, and he enjoys ...
- 怎样看懂Oracle的执行计划
怎样看懂Oracle的执行计划 一.什么是执行计划 An explain plan is a representation of the access path that is taken when ...
- MyEclipse10的一些问题(git插件,jdk7)
egit: MyEclipse10 要装 egit2.3,版本错了安装不成功; jdk7: 10.5好像是不支持JDK1.7的,换成10.7; JDK1.7中的switch支持String类型的,1. ...