验证内置的2级缓存

Ehcache缓存的配置

01.引入需要的ehcache 和mybatis-ehcache 两个jar包

02.在mapper文件中增加  <cache type="org.mybatis.caches.ehcache.EhcacheCache"/> <!-- 配置Ehcache缓存 -->

org.mybatis.caches.ehcache.EhcacheCache就是在mybatis-ehcache这个jar包中

03.引入需要的ecache.xml文件   就在ecache.jar中

创建对应的dao

  1. public interface StudentDao {
  2. /**
  3. * 验证mybatis2级缓存!
  4. */
  5. Student selectStudentById(Integer sId);
  6.  
  7. }

创建对应的mapper文件

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!DOCTYPE mapper
  3. PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  4. "http://mybatis.org/dtd/mybatis-3-Mapper.dtd">
  5. <mapper namespace="cn.bdqn.dao.StudentDao">
  6. <cache/> <!-- 配置2级缓存 -->
  7. <select id="selectStudentById" resultType="Student">
  8. select sid,sname from student where sid=#{xxx}
  9. </select>
  10.  
  11. </mapper>

实体类实现Serializable序列化接口

  1. /**
  2. *学生对应的实体类
  3. */
  4. public class Student implements Serializable {
  5.  
  6. private Integer sId;
  7. private String sName;
  8.  
  9. public Integer getsId() {
  10. return sId;
  11. }
  12. public void setsId(Integer sId) {
  13. this.sId = sId;
  14. }
  15. public String getsName() {
  16. return sName;
  17. }
  18. public void setsName(String sName) {
  19. this.sName = sName;
  20. }
  21. public Student(Integer sId, String sName) {
  22. super();
  23. this.sId = sId;
  24. this.sName = sName;
  25. }
  26. public Student() {
  27. super();
  28. }
  29. @Override
  30. public String toString() {
  31. return "Student [sId=" + sId + ", sName=" + sName +"]";
  32. }
  33.  
  34. }

把log4j的配置文件中的显示改成

增加测试类代码

  1. package cn.bdqn.test;
  2.  
  3. import java.util.ArrayList;
  4. import java.util.HashMap;
  5. import java.util.List;
  6. import java.util.Map;
  7.  
  8. import org.apache.ibatis.session.SqlSession;
  9. import org.junit.After;
  10. import org.junit.Before;
  11. import org.junit.Test;
  12.  
  13. import cn.bdqn.bean.Student;
  14. import cn.bdqn.dao.StudentDao;
  15. import cn.bdqn.util.SessionUtil;
  16.  
  17. public class TeacherTest {
  18. StudentDao dao;
  19. SqlSession session;
  20.  
  21. @Before
  22. public void before() {
  23. // 因为需要关闭session 需要把session提取出去
  24. session = SessionUtil.getSession();
  25. dao = session.getMapper(StudentDao.class);
  26. }
  27.  
  28. @After
  29. public void after() {
  30. if (session != null) {
  31. session.close();
  32. }
  33. }
  34.  
  35. /**
  36. * 验证2级缓存
  37. *
  38. * 开启内置2级缓存的步骤
  39. * 01.实体类对象 要实现serializable 序列化接口
  40. * 02.在mapper文件中 增加 <cache/>节点
  41. */
  42. @Test
  43. public void test1() {
  44. Student student = dao.selectStudentById(1);
  45. System.out.println(student);
  46.  
  47. session.close(); //关闭了session 一级缓存中的数据肯定清空了
  48.  
  49. session = SessionUtil.getSession(); //再次获取session 查询数据
  50. dao = session.getMapper(StudentDao.class);
  51. //这时候不会再有sql语句了 因为2级缓存中存在相同的查询(mapper文件中sql的id)和相同的sql语句
  52. Student student2 = dao.selectStudentById(1);
  53. System.out.println(student2);
  54. }
  55.  
  56. }

查看运行的结果

验证增删改对2级缓存的影响

在dao中新增方法

  1. public interface StudentDao {
  2. /**
  3. * 验证mybatis2级缓存!
  4. */
  5. Student selectStudentById(Integer sId);
  6.  
  7. /**
  8. * 验证增删改查对2级缓存的影响!
  9. */
  10. void addStudent(Student student);
  11. }

在mapper文件中新增

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!DOCTYPE mapper
  3. PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  4. "http://mybatis.org/dtd/mybatis-3-Mapper.dtd">
  5. <mapper namespace="cn.bdqn.dao.StudentDao">
  6. <cache/> <!-- 配置2级缓存 -->
  7. <select id="selectStudentById" resultType="Student">
  8. select sid,sname from student where sid=#{xxx}
  9. </select>
  10.  
  11. <!-- 新增一个学生 验证对2级缓存的影响 标签中 增加 flushCache="false" 可以设置在新增数据的时候不刷新2级缓存
  1. 但是一级缓存不能配置 也就是 只要是一级缓存的增删改 都会刷新 -->
  2.  
  3. <insert id="addStudent"> insert into student values(#{sId},#{sName}) <!--#{sId},#{sName} 对应的是实体类中的属性 --></insert></mapper>

在测试类中新增

  1. /**
  2. * 验证增删改对2级缓存的影响
  3. */
  4. @Test
  5. public void test2() {
  6. Student student = dao.selectStudentById(1);
  7. System.out.println(student);
  8.  
  9. session.close(); //关闭了session 一级缓存中的数据肯定清空了
  10.  
  11. session = SessionUtil.getSession(); //再次获取session 查询数据
  12. dao = session.getMapper(StudentDao.class);
  13. //新增学生信息 看看对2级缓存的影响
  14. dao.addStudent(new Student(66,"测试"));
  15.  
  16. Student student2 = dao.selectStudentById(1);
  17. System.out.println(student2);
  18. }

得到的结果:

2级缓存的关闭

  1. /**
  2. * 2级缓存的关闭
  3. * 01.局部关闭
  4. * 在mapper文件中修改
  5. * <select id="selectStudentById" useCache="false" resultType="Student">
  6. * 增加了useCache="false" 相当于 局部关闭 2级缓存 useCache默认值为true===》把查询放入2级缓存
  7. * 02.全局关闭
  8. * 在mybatis.xml文件中增加
  9. * <settings>
  10. * <!--全局关闭2级缓存 -->
  11. * <setting name="cacheEnabled" value="false"/>
  12. * </settings>
  13. */
  14.  
  15. @Test
  16. public void test3() {
  17. Student student = dao.selectStudentById(1);
  18. System.out.println(student);
  19.  
  20. session.close(); //关闭了session 一级缓存中的数据肯定清空了
  21.  
  22. session = SessionUtil.getSession(); //再次获取session 查询数据
  23. dao = session.getMapper(StudentDao.class);
  24. //这时候不会再有sql语句了 因为2级缓存中存在相同的查询(mapper文件中sql的id)和相同的sql语句
  25. Student student2 = dao.selectStudentById(1);
  26. System.out.println(student2);
  27. }
  28.  
  29. /**
  30. * 2级缓存的使用原则:
  31. * 01. 很少被修改的数据
  32. * 02. 不是很重要的数据,允许出现偶尔并发的数据
  33. * 03. 不会被并发访问的数据
  34. * 04.多个namespace不能操作同一张表
  35. * 05.不能在关联关系表上执行增删改操作
  36. */

mybatis13--2级缓存的更多相关文章

  1. 缓存篇(Cache)~第三回 HttpModule实现网页的文件级缓存

    返回目录 再写完缓存篇第一回之后,得到了很多朋友的好评和来信,所以,决定加快步伐,尽快把剩下的文章写完,本篇是第三回,主要介绍使用HttpModule实现的文件级缓存,在看本文之前,大家需要限度Htt ...

  2. Hibernate-二级缓存策略

    二级缓存的策略 当多个并发的事务同时访问持久化层的缓存中的相同数据时,会引起并发问题,必须采用必要的事务隔离措施. 在进程范围或集群范围的缓存,即第二级缓存,会出现并发问题.因此可以设定以下4种类型的 ...

  3. Hibernate-一级缓存session

    hibernate提供的一级缓存 hibernate是一个线程对应一个session,一个线程可以看成一个用户.也就是说session级缓存(一级缓存)只能给一个线程用,别的线程用不了,一级缓存就是和 ...

  4. Spring+ehcache+redis两级缓存

    问题描述 场景:我们的应用系统是分布式集群的,可横向扩展的.应用中某个接口操作满足以下一个或多个条件: 1. 接口运行复杂代价大, 2. 接口返回数据量大, 3. 接口的数据基本不会更改, 4. 接口 ...

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

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

  6. 用guava快速打造两级缓存能力

    首先,咱们都有一共识,即可以使用缓存来提升系统的访问速度! 现如今,分布式缓存这么强大,所以,大部分时候,我们可能都不会去关注本地缓存了! 而在一起高并发的场景,如果我们一味使用nosql式的缓存,如 ...

  7. Redis+Caffeine两级缓存,让访问速度纵享丝滑

    原创:微信公众号 码农参上,欢迎分享,转载请保留出处. 在高性能的服务架构设计中,缓存是一个不可或缺的环节.在实际的项目中,我们通常会将一些热点数据存储到Redis或MemCache这类缓存中间件中, ...

  8. 基于Spring接口,集成Caffeine+Redis两级缓存

    原创:微信公众号 码农参上,欢迎分享,转载请保留出处. 在上一篇文章Redis+Caffeine两级缓存,让访问速度纵享丝滑中,我们介绍了3种整合Caffeine和Redis作为两级缓存使用的方法,虽 ...

  9. Spring的3级缓存和循环引用的理解

    此处是我自己的一个理解,防止以后忘记,如若那个地方理解不对,欢迎指出. 一.背景 在我们写代码的过程中一般会使用 @Autowired 来注入另外的一个对象,但有些时候发生了 循环依赖,但是我们的代码 ...

随机推荐

  1. 大数据学习环境搭建(CentOS6.9+Hadoop2.7.3+Hive1.2.1+Hbase1.3.1+Spark2.1.1)

    node1 192.168.1.11 node2 192.168.1.12 node3 192.168.1.13 备注 NameNode Hadoop Y Y 高可用 DateNode Y Y Y R ...

  2. 毕业论文Word格式技巧

    word利用多级列表功能实现章节标题自动编号 坑:在选择级别1后,直接在当前对话框直接继续设置级别2:然后选中级别2,设置相应的格式,主要在将级别链接到样式处选择为标题2,然后要在库中显示的级别选择级 ...

  3. ES6 与 React

    Node和NPM/*安装npm*/npm installnpm install <package>npm install -g <package> /*更新安装包*/npm u ...

  4. HashMap代码解析

    hashmap (jdk 1.7)使用 “数组-链表” 方式进行存储,图形化表示如下: 即,前面是一个数组,后面跟一个链表,那么数据结构这个对应到HashMap的代码里面是什么样子的呢? 在HashM ...

  5. 使用elasticsearch分页时报max_result_window is too large的错误解决方案

    使用elasticsearch进行深度分页查询时的size-from大于10000的时候,会提示一个max_result_window is too large的错误. 官方推荐是scroll查询返回 ...

  6. InfluxDB服务器启动流程

    操作系统 : CentOS7.3.1611_x64 go语言版本:1.8.3 linux/amd64 InfluxDB版本:1.1.0 源码路径: github.com/influxdata/infl ...

  7. Linux基础知识之用户和用户组以及 Linux 权限管理

    已经开始接触Linux用户管理,用户组管理,以及权限管理这几个逼格满满的关键字.这几个关键字对于前端程序猿的我来说真的是很高大上有木有,以前尝试学 Linux 的时候看到这些名词总是下意识的跳过不敢看 ...

  8. Git忽略规则.gitignore忽略node_modules文件夹

    在项目文件夹里添加.gitignore的文件 打开文件,在里面添加 /node_modules

  9. myeclipse16怎么去掉项目中的CodeLive Panel?

    http://www.jb51.net/softjc/524823.html —————————————————————————————————————————————————— 在Servers视图 ...

  10. Kafka Eagle Consumers不显示

    原因: kafka.eagle.offset.storage配置有误 该配置的作用:# kafka offset storage -- Offset stored in a Kafka cluster ...