MyBatis学习总结(七)——Mybatis缓存(转载)
孤傲苍狼
只为成功找方法,不为失败找借口!
MyBatis学习总结(七)——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一级缓存测试

- 1 package me.gacl.test;
- 2
- 3 import me.gacl.domain.User;
- 4 import me.gacl.util.MyBatisUtil;
- 5 import org.apache.ibatis.session.SqlSession;
- 6 import org.junit.Test;
- 7
- 8 /**
- 9 * @author gacl
- 10 * 测试一级缓存
- 11 */
- 12 public class TestOneLevelCache {
- 13
- 14 /*
- 15 * 一级缓存: 也就Session级的缓存(默认开启)
- 16 */
- 17 @Test
- 18 public void testCache1() {
- 19 SqlSession session = MyBatisUtil.getSqlSession();
- 20 String statement = "me.gacl.mapping.userMapper.getUser";
- 21 User user = session.selectOne(statement, 1);
- 22 System.out.println(user);
- 23
- 24 /*
- 25 * 一级缓存默认就会被使用
- 26 */
- 27 user = session.selectOne(statement, 1);
- 28 System.out.println(user);
- 29 session.close();
- 30 /*
- 31 1. 必须是同一个Session,如果session对象已经close()过了就不可能用了
- 32 */
- 33 session = MyBatisUtil.getSqlSession();
- 34 user = session.selectOne(statement, 1);
- 35 System.out.println(user);
- 36
- 37 /*
- 38 2. 查询条件是一样的
- 39 */
- 40 user = session.selectOne(statement, 2);
- 41 System.out.println(user);
- 42
- 43 /*
- 44 3. 没有执行过session.clearCache()清理缓存
- 45 */
- 46 //session.clearCache();
- 47 user = session.selectOne(statement, 2);
- 48 System.out.println(user);
- 49
- 50 /*
- 51 4. 没有执行过增删改的操作(这些操作都会清理缓存)
- 52 */
- 53 session.update("me.gacl.mapping.userMapper.updateUser",
- 54 new User(2, "user", 23));
- 55 user = session.selectOne(statement, 2);
- 56 System.out.println(user);
- 57
- 58 }
- 59 }

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

- 1 package me.gacl.test;
- 2
- 3 import me.gacl.domain.User;
- 4 import me.gacl.util.MyBatisUtil;
- 5 import org.apache.ibatis.session.SqlSession;
- 6 import org.apache.ibatis.session.SqlSessionFactory;
- 7 import org.junit.Test;
- 8
- 9 /**
- 10 * @author gacl
- 11 * 测试二级缓存
- 12 */
- 13 public class TestTwoLevelCache {
- 14
- 15 /*
- 16 * 测试二级缓存
- 17 * 使用两个不同的SqlSession对象去执行相同查询条件的查询,第二次查询时不会再发送SQL语句,而是直接从缓存中取出数据
- 18 */
- 19 @Test
- 20 public void testCache2() {
- 21 String statement = "me.gacl.mapping.userMapper.getUser";
- 22 SqlSessionFactory factory = MyBatisUtil.getSqlSessionFactory();
- 23 //开启两个不同的SqlSession
- 24 SqlSession session1 = factory.openSession();
- 25 SqlSession session2 = factory.openSession();
- 26 //使用二级缓存时,User类必须实现一个Serializable接口===> User implements Serializable
- 27 User user = session1.selectOne(statement, 1);
- 28 session1.commit();//不懂为啥,这个地方一定要提交事务之后二级缓存才会起作用
- 29 System.out.println("user="+user);
- 30
- 31 //由于使用的是两个不同的SqlSession对象,所以即使查询条件相同,一级缓存也不会开启使用
- 32 user = session2.selectOne(statement, 1);
- 33 //session2.commit();
- 34 System.out.println("user2="+user);
- 35 }
- 36 }

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"/> <!--只读-->
MyBatis学习总结(七)——Mybatis缓存(转载)的更多相关文章
- 【转】MyBatis学习总结(七)——Mybatis缓存
[转]MyBatis学习总结(七)——Mybatis缓存 一.MyBatis缓存介绍 正如大多数持久层框架一样,MyBatis 同样提供了一级缓存和二级缓存的支持 一级缓存: 基于PerpetualC ...
- MyBatis学习总结(七)——Mybatis缓存
一.MyBatis缓存介绍 正如大多数持久层框架一样,MyBatis 同样提供了一级缓存和二级缓存的支持 一级缓存: 基于PerpetualCache 的 HashMap本地缓存,其存储作用域为 Se ...
- MyBatis学习总结(七)——Mybatis缓存
一.MyBatis缓存介绍 正如大多数持久层框架一样,MyBatis 同样提供了一级缓存和二级缓存的支持 一级缓存: 基于PerpetualCache 的 HashMap本地缓存,其存储作用域为 Se ...
- MyBatis学习笔记(七)——Mybatis缓存
转自孤傲苍狼的博客:http://www.cnblogs.com/xdp-gacl/p/4270403.html 一.MyBatis缓存介绍 正如大多数持久层框架一样,MyBatis 同样提供了一级缓 ...
- 七:MyBatis学习总结(七)——Mybatis缓存
---恢复内容开始--- 一.MyBatis缓存介绍 正如大多数持久层框架一样,MyBatis 同样提供了一级缓存和二级缓存的支持 一级缓存: 基于PerpetualCache 的 HashMap本地 ...
- 转:MyBatis学习总结(Mybatis总结精华文章)
http://www.cnblogs.com/xdp-gacl/tag/MyBatis%E5%AD%A6%E4%B9%A0%E6%80%BB%E7%BB%93/ 当前标签: MyBatis学习总结 ...
- mybatis学习笔记(14)-查询缓存之中的一个级缓存
mybatis学习笔记(14)-查询缓存之中的一个级缓存 标签: mybatis mybatis学习笔记14-查询缓存之中的一个级缓存 查询缓存 一级缓存 一级缓存工作原理 一级缓存測试 一级缓存应用 ...
- 【转】MyBatis学习总结(一)——MyBatis快速入门
[转]MyBatis学习总结(一)——MyBatis快速入门 一.Mybatis介绍 MyBatis是一个支持普通SQL查询,存储过程和高级映射的优秀持久层框架.MyBatis消除了几乎所有的JDBC ...
- MyBatis 学习记录5 MyBatis的二级缓存
主题 之前学习了一下MyBatis的一级缓存,主要涉及到BaseExecutor这个类. 现在准备学习记录下MyBatis二级缓存. 配置二级缓存与初始化发生的事情 首先二级缓存默认是不开启的,需要自 ...
随机推荐
- Ruby 方法
Ruby 方法 Ruby 方法与其他编程语言中的函数类似.Ruby 方法用于捆绑一个或多个重复的语句到一个单元中. 方法名应以小写字母开头.如果您以大写字母作为方法名的开头,Ruby 可能会把它当作常 ...
- ubuntu 安装git服务器
ubuntu14.04安装git,搭建环境 1.sudo apt-get install git 2.生成key ssh-keygen -t rsa 3.保存其他用户,创建的ssh用户密码 cd .s ...
- js内存泄露的几种情况
想解决内存泄露问题,必须知道什么是内存泄露,什么情况下出现内存泄露,才能在遇到问题时,逐个排除.这里只讨论那些不经意间的内存泄露. 一.什么是内存泄露 内存泄露是指一块被分配的内存既不能使用,又不能回 ...
- Python初学的易犯错误
当初学 Python 时,想要弄懂 Python 的错误信息的含义可能有点复杂.这里列出了常见的的一些让你程序 crash 的运行时错误. 1)忘记在 if , elif , else , for , ...
- C# SqlBulkCopy
public void Insert_Table(System.Data.DataTable dataTable) { try { ...
- golang,liteide设置 windows7(64)
1.安转go的环境,exe安装包 2.下载liteide27.2.1 3.打开liteide开始开发,在里面添加gopath,无法读取windows里面的gopath设置,不知道什么原因,以管理员运行 ...
- openjudge-膨胀的木棍
http://noi.openjudge.cn/ch0111/09/ 总时间限制: 1000ms 内存限制: 65536kB 描述 当长度为L的一根细木棍的温度升高n度,它会膨胀到新的长度L'=(1 ...
- VS中Debug和Realease、及静态库和动态库的区别整理(转)
原文出自:http://www.cnblogs.com/chensu/p/5632486.html 一.Debug和Realease区别产生的原因 Debug 通常称为调试版本,它包含调试信息,并且不 ...
- C++ 数字转字符串
#include <sstream> string num2str( int i) { stringstream ss; ss<<i; return ss.strs(); }
- day1作业--登录入口
作业概述: 编写一个登录入口,实现如下功能: (1)输入用户名和密码 (2)认证成功后显示欢迎信息 (3)输错三次后锁定 流程图: readme: 1.程序配置文件: 黑名单文件blacklist.t ...