一、MyBatis缓存介绍

  正如大多数持久层框架一样,MyBatis 同样提供了一级缓存二级缓存的支持

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

1.2、Mybatis二级缓存测试

  1、开启二级缓存,在userMapper.xml文件中添加如下配置

  1. <mapper namespace="me.gacl.mapping.userMapper">
  2. <!-- 开启二级缓存 -->
  3. <cache/>

  2、测试二级缓存

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

1.3、二级缓存补充说明

  1. 映射语句文件中的所有select语句将会被缓存。

  2. 映射语句文件中的所有insert,update和delete语句会刷新缓存。

  3. 缓存会使用Least Recently Used(LRU,最近最少使用的)算法来收回。

  4. 缓存会根据指定的时间间隔来刷新。

  5. 缓存会存储1024个对象

cache标签常用属性:

  1. <cache
  2. eviction="FIFO" <!--回收策略为先进先出-->
  3. flushInterval="60000" <!--自动刷新时间60s-->
  4. size="512" <!--最多缓存512个引用对象-->
  5. readOnly="true"/> <!--只读-->

MyBatis学习总结(7)——Mybatis缓存的更多相关文章

  1. MyBatis学习总结(七)——Mybatis缓存(转载)

      孤傲苍狼 只为成功找方法,不为失败找借口! MyBatis学习总结(七)--Mybatis缓存 一.MyBatis缓存介绍 正如大多数持久层框架一样,MyBatis 同样提供了一级缓存和二级缓存的 ...

  2. 【转】MyBatis学习总结(七)——Mybatis缓存

    [转]MyBatis学习总结(七)——Mybatis缓存 一.MyBatis缓存介绍 正如大多数持久层框架一样,MyBatis 同样提供了一级缓存和二级缓存的支持 一级缓存: 基于PerpetualC ...

  3. mybatis学习笔记(14)-查询缓存之中的一个级缓存

    mybatis学习笔记(14)-查询缓存之中的一个级缓存 标签: mybatis mybatis学习笔记14-查询缓存之中的一个级缓存 查询缓存 一级缓存 一级缓存工作原理 一级缓存測试 一级缓存应用 ...

  4. 转:MyBatis学习总结(Mybatis总结精华文章)

    http://www.cnblogs.com/xdp-gacl/tag/MyBatis%E5%AD%A6%E4%B9%A0%E6%80%BB%E7%BB%93/ 当前标签: MyBatis学习总结   ...

  5. 【转】MyBatis学习总结(一)——MyBatis快速入门

    [转]MyBatis学习总结(一)——MyBatis快速入门 一.Mybatis介绍 MyBatis是一个支持普通SQL查询,存储过程和高级映射的优秀持久层框架.MyBatis消除了几乎所有的JDBC ...

  6. MyBatis 学习记录5 MyBatis的二级缓存

    主题 之前学习了一下MyBatis的一级缓存,主要涉及到BaseExecutor这个类. 现在准备学习记录下MyBatis二级缓存. 配置二级缓存与初始化发生的事情 首先二级缓存默认是不开启的,需要自 ...

  7. MyBatis 学习记录4 MyBatis的一级缓存

    主题 分享记录一下MyBatis的一级缓存相关的学习. Demo public static void firstLevelCache() { init("mybatis-config.xm ...

  8. MyBatis学习总结(七)——Mybatis缓存

    一.MyBatis缓存介绍 正如大多数持久层框架一样,MyBatis 同样提供了一级缓存和二级缓存的支持 一级缓存: 基于PerpetualCache 的 HashMap本地缓存,其存储作用域为 Se ...

  9. MyBatis学习总结(七)——Mybatis缓存

    一.MyBatis缓存介绍 正如大多数持久层框架一样,MyBatis 同样提供了一级缓存和二级缓存的支持 一级缓存: 基于PerpetualCache 的 HashMap本地缓存,其存储作用域为 Se ...

  10. MyBatis学习笔记(七)——Mybatis缓存

    转自孤傲苍狼的博客:http://www.cnblogs.com/xdp-gacl/p/4270403.html 一.MyBatis缓存介绍 正如大多数持久层框架一样,MyBatis 同样提供了一级缓 ...

随机推荐

  1. CentOS中防火墙相关的命令(CentOS7中演示)

    CentOS中防火墙程序主要是firewall和iptables,CentOS7中firewall服务已经默认安装好了,而iptables服务需要自己用yum  install  iptabes-se ...

  2. 获取DATA的数据

    num=DataTable("参数名",dtGlobalSheet) 'systemutil.Run "C:\Program Files (x86)\HP\QuickTe ...

  3. 【百度语音识别】JavaAPI方式语音识别示例

    https://ai.baidu.com/forum/topic/show/496730

  4. 关于excel导入、导出(POI)

    当前B/S模式已成为应用开发的主流,而在企业办公系统中,常常有客户这样子要求:你要把我们的报表直接用Excel打开(电信系统.银行系统).或者是:我们已经习惯用Excel打印.这样在我们实际的开发中, ...

  5. Window7幻灯片字体显示混乱,难道真的是病毒么

    这个问题有几天了.就是在其它人的PowerPoint2010做的ppt文件.发到这台有问题的电脑上(PowerPoint2007)就会显示全然不一样.例如以下所看到的. watermark/2/tex ...

  6. 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. ...

  7. 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 ...

  8. Apache支持多端口配置处理

    玩了这么多年,终于知道原来Apache也可以支持多个端口监听!!!!!!!!!!!!!!!!!!!这样就可以一个服务器,存放多个项目了,一个ip多个端口,匹配多个项目. 试了下linux,也是可以的 ...

  9. docker compose的使用--在线安装未完成

    Compose 是一个用户定义和运行多个容器的 Docker 应用程序.在 Compose 中你可以使用 YAML 文件来配置你的应用服务.然后,只需要一个简单的命令,就可以创建并启动你配置的所有服务 ...

  10. nginx报错日志:see security.limit_extensions

    访问出现部分.js.css等部分文件被拒绝错误日志如下: 19:20:13 [error] 1181#0: *287 FastCGI sent in stderr: "Access to t ...