孤傲苍狼

只为成功找方法,不为失败找借口!

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

一、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学习总结(七)——Mybatis缓存(转载)的更多相关文章

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

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

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

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

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

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

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

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

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

    ---恢复内容开始--- 一.MyBatis缓存介绍 正如大多数持久层框架一样,MyBatis 同样提供了一级缓存和二级缓存的支持 一级缓存: 基于PerpetualCache 的 HashMap本地 ...

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

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

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

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

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

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

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

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

随机推荐

  1. Ruby 方法

    Ruby 方法 Ruby 方法与其他编程语言中的函数类似.Ruby 方法用于捆绑一个或多个重复的语句到一个单元中. 方法名应以小写字母开头.如果您以大写字母作为方法名的开头,Ruby 可能会把它当作常 ...

  2. ubuntu 安装git服务器

    ubuntu14.04安装git,搭建环境 1.sudo apt-get install git 2.生成key ssh-keygen -t rsa 3.保存其他用户,创建的ssh用户密码 cd .s ...

  3. js内存泄露的几种情况

    想解决内存泄露问题,必须知道什么是内存泄露,什么情况下出现内存泄露,才能在遇到问题时,逐个排除.这里只讨论那些不经意间的内存泄露. 一.什么是内存泄露 内存泄露是指一块被分配的内存既不能使用,又不能回 ...

  4. Python初学的易犯错误

    当初学 Python 时,想要弄懂 Python 的错误信息的含义可能有点复杂.这里列出了常见的的一些让你程序 crash 的运行时错误. 1)忘记在 if , elif , else , for , ...

  5. C# SqlBulkCopy

    public void Insert_Table(System.Data.DataTable dataTable)        {            try            {       ...

  6. golang,liteide设置 windows7(64)

    1.安转go的环境,exe安装包 2.下载liteide27.2.1 3.打开liteide开始开发,在里面添加gopath,无法读取windows里面的gopath设置,不知道什么原因,以管理员运行 ...

  7. openjudge-膨胀的木棍

    http://noi.openjudge.cn/ch0111/09/ 总时间限制: 1000ms  内存限制: 65536kB 描述 当长度为L的一根细木棍的温度升高n度,它会膨胀到新的长度L'=(1 ...

  8. VS中Debug和Realease、及静态库和动态库的区别整理(转)

    原文出自:http://www.cnblogs.com/chensu/p/5632486.html 一.Debug和Realease区别产生的原因 Debug 通常称为调试版本,它包含调试信息,并且不 ...

  9. C++ 数字转字符串

    #include <sstream> string num2str( int i) { stringstream ss; ss<<i; return ss.strs(); }

  10. day1作业--登录入口

    作业概述: 编写一个登录入口,实现如下功能: (1)输入用户名和密码 (2)认证成功后显示欢迎信息 (3)输错三次后锁定 流程图: readme: 1.程序配置文件: 黑名单文件blacklist.t ...