MyBatis学习总结(7)——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学习总结(7)——Mybatis缓存的更多相关文章
- MyBatis学习总结(七)——Mybatis缓存(转载)
孤傲苍狼 只为成功找方法,不为失败找借口! MyBatis学习总结(七)--Mybatis缓存 一.MyBatis缓存介绍 正如大多数持久层框架一样,MyBatis 同样提供了一级缓存和二级缓存的 ...
- 【转】MyBatis学习总结(七)——Mybatis缓存
[转]MyBatis学习总结(七)——Mybatis缓存 一.MyBatis缓存介绍 正如大多数持久层框架一样,MyBatis 同样提供了一级缓存和二级缓存的支持 一级缓存: 基于PerpetualC ...
- mybatis学习笔记(14)-查询缓存之中的一个级缓存
mybatis学习笔记(14)-查询缓存之中的一个级缓存 标签: mybatis mybatis学习笔记14-查询缓存之中的一个级缓存 查询缓存 一级缓存 一级缓存工作原理 一级缓存測试 一级缓存应用 ...
- 转:MyBatis学习总结(Mybatis总结精华文章)
http://www.cnblogs.com/xdp-gacl/tag/MyBatis%E5%AD%A6%E4%B9%A0%E6%80%BB%E7%BB%93/ 当前标签: MyBatis学习总结 ...
- 【转】MyBatis学习总结(一)——MyBatis快速入门
[转]MyBatis学习总结(一)——MyBatis快速入门 一.Mybatis介绍 MyBatis是一个支持普通SQL查询,存储过程和高级映射的优秀持久层框架.MyBatis消除了几乎所有的JDBC ...
- MyBatis 学习记录5 MyBatis的二级缓存
主题 之前学习了一下MyBatis的一级缓存,主要涉及到BaseExecutor这个类. 现在准备学习记录下MyBatis二级缓存. 配置二级缓存与初始化发生的事情 首先二级缓存默认是不开启的,需要自 ...
- MyBatis 学习记录4 MyBatis的一级缓存
主题 分享记录一下MyBatis的一级缓存相关的学习. Demo public static void firstLevelCache() { init("mybatis-config.xm ...
- 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 同样提供了一级缓 ...
随机推荐
- CentOS中防火墙相关的命令(CentOS7中演示)
CentOS中防火墙程序主要是firewall和iptables,CentOS7中firewall服务已经默认安装好了,而iptables服务需要自己用yum install iptabes-se ...
- 获取DATA的数据
num=DataTable("参数名",dtGlobalSheet) 'systemutil.Run "C:\Program Files (x86)\HP\QuickTe ...
- 【百度语音识别】JavaAPI方式语音识别示例
https://ai.baidu.com/forum/topic/show/496730
- 关于excel导入、导出(POI)
当前B/S模式已成为应用开发的主流,而在企业办公系统中,常常有客户这样子要求:你要把我们的报表直接用Excel打开(电信系统.银行系统).或者是:我们已经习惯用Excel打印.这样在我们实际的开发中, ...
- Window7幻灯片字体显示混乱,难道真的是病毒么
这个问题有几天了.就是在其它人的PowerPoint2010做的ppt文件.发到这台有问题的电脑上(PowerPoint2007)就会显示全然不一样.例如以下所看到的. watermark/2/tex ...
- No unique bean of type [net.shougongfang.action.paymoney.AlipayPayMoneyReturnObj] is defined: Unsat
0 你把@Service放到实现类上吧.这个问题好像不止一个人在问啦 2013年10月25日 10:34 shidan66 30 0 1 1 加入评论 00 1,@service放到实现上 2. ...
- How to remove focus without setting focus to another control?
How to remove focus without setting focus to another control? Ask Question up vote 67 down vote favo ...
- Apache支持多端口配置处理
玩了这么多年,终于知道原来Apache也可以支持多个端口监听!!!!!!!!!!!!!!!!!!!这样就可以一个服务器,存放多个项目了,一个ip多个端口,匹配多个项目. 试了下linux,也是可以的 ...
- docker compose的使用--在线安装未完成
Compose 是一个用户定义和运行多个容器的 Docker 应用程序.在 Compose 中你可以使用 YAML 文件来配置你的应用服务.然后,只需要一个简单的命令,就可以创建并启动你配置的所有服务 ...
- nginx报错日志:see security.limit_extensions
访问出现部分.js.css等部分文件被拒绝错误日志如下: 19:20:13 [error] 1181#0: *287 FastCGI sent in stderr: "Access to t ...