MyBatis的缓存机制

缓存就是内存中的一个空间,通常用来提高查询效率

MyBatis支持两种缓存技术:一级缓存和二级缓存,其中一级缓存默认开启,二级缓存默认关闭

一级缓存

(1)一级缓存默认开启

(2)是一种基于SqlSession的缓存,同一个SqlSession有效,不同的SqlSession无效

(3)同一个id,可以走缓存;不同id,即使查询的内容相同,也不会走缓存

//加载核心配置文件
InputStream is = Resources.getResourceAsStream("mybatis-cfg.xml");
//基于构建者创建工厂对象
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(is);
//通过工厂创建sqlSession对象:测试一级缓存
//第一次查询
SqlSession sqlSession1 = factory.openSession();
List<User> list1 = sqlSession1.selectList("selAll1");
System.out.println(list1);
System.out.println("*************************");
//第二次查询
List<User> list2 = sqlSession1.selectList("selAll1");
System.out.println(list2);
sqlSession1.close();

  

//加载核心配置文件
InputStream is = Resources.getResourceAsStream("mybatis-cfg.xml");
//基于构建者创建工厂对象
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(is);
//通过工厂创建sqlSession对象:测试一级缓存
SqlSession sqlSession1 = factory.openSession();
List<User> list1 = sqlSession1.selectList("selAll1");
System.out.println(list1);
System.out.println("***********不同id,即使内容相同,也不走缓存**************");
List<User> list2 = sqlSession1.selectList("selAll2");
System.out.println(list2);
sqlSession1.close();

  

//加载核心配置文件
InputStream is = Resources.getResourceAsStream("mybatis-cfg.xml");
//基于构建者创建工厂对象
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(is);
//通过工厂创建sqlSession对象:测试一级缓存
SqlSession sqlSession1 = factory.openSession();
List<User> list1 = sqlSession1.selectList("selAll1");
System.out.println(list1);
// sqlSession1.close();
System.out.println("***********不是同一个sqlSession,不会走缓存**************");
SqlSession sqlSession2 = factory.openSession();
List<User> list2 = sqlSession2.selectList("selAll1");
// System.out.println(list2);

  

二级缓存

(1)二级缓存默认关闭

(2)是一种基于SqlSessionFactory的缓存,同一个工厂创建的SqlSession有效,不同工厂则无效

(3)需要使用时,应在指定的namespace下进行开启

(4)<cache>标签的属性

  eviction:缓存清除策略,常用的有LRU、FIFO、SOFT、WEAK

  flushInterval:刷新间隔,需要给定一个毫秒数,表示指定时间间隔时,会自动刷新缓存

  size:设置大小,默认是1024

  readOnly:是否只读(不写入文件),默认是false,需要实体类实现序列化接口

  type:用于自定义缓存机制,提供一个自定义类的全限定路径,自定义类需要实现CaChe接口

//加载核心配置文件
InputStream is = Resources.getResourceAsStream("mybatis-cfg.xml");
//基于构建者创建工厂对象
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(is);
//通过工厂创建sqlSession对象:测试二级缓存
SqlSession sqlSession1 = factory.openSession(); List<User> list1 = sqlSession1.selectList("selAll1");
System.out.println(list1);
sqlSession1.close(); System.out.println("***********同一个工厂的sqlSession,会走缓存**************");
SqlSession sqlSession2 = factory.openSession();
List<User> list2 = sqlSession2.selectList("selAll1");
System.out.println(list2);

  

“cache hit ratio”中文意思是“缓存命中率”。

这是一个计算机术语,终端用户访问加速节点时,如果该节点有缓存住了要被访问的数据时就叫做命中,如果没有的话需要回原服务器取,就是没有命中。

序列化问题:

//加载核心配置文件
InputStream is = Resources.getResourceAsStream("mybatis-cfg.xml");
//基于构建者创建工厂对象
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(is);
//通过工厂创建sqlSession对象:测试二级缓存
SqlSession sqlSession1 = factory.openSession(); List<User> list1 = sqlSession1.selectList("selAll1");
System.out.println(list1);
sqlSession1.close();

  

原因分析:

User实现类未实现序列化

为什么要实现序列化:

(1)缓存机制:将查询结果保存到内存中

(2)内存饱满,需要移出时,MyBatis就会自动将内存中的内容进行移除,但是文件很重要,不能,此时就需要进行序列化,以文件的形式将内容从内存保存到硬盘上,一个内容保存成文件的读写,必须实现序列化。

解决方案:

一:User实体类实现序列化

二:在<cache>标签中添加readOnly属性

表示:要求Mybatis对缓存内容只读不写,当需要移除的时候,直接删除,不需要进行转存。

MyBatis的一级缓存、二级缓存演示以及讲解,序列化异常的处理的更多相关文章

  1. Mybatis 的一级、二级缓存?

    1)一级缓存: 基于 PerpetualCache 的 HashMap 本地缓存,其存储作用域为 Session,当 Session flush 或 close 之后,该 Session 中的所有 C ...

  2. Mybatis 的一级、二级缓存?

    1)一级缓存: 基于 PerpetualCache 的 HashMap 本地缓存,其存储作用域为 Session,当 Session flush 或 close 之后,该 Session 中的所有 C ...

  3. Mybatis一级、二级缓存

      Mybatis一级.二级缓存   一级缓存 首先做一个测试,创建一个mapper配置文件和mapper接口,我这里用了最简单的查询来演示. <mapper namespace="c ...

  4. mybatis的缓存机制(一级缓存二级缓存和刷新缓存)和mybatis整合ehcache

    1.1  什么是查询缓存 mybatis提供查询缓存,用于减轻数据压力,提高数据库性能. mybaits提供一级缓存,和二级缓存. 一级缓存是SqlSession级别的缓存.在操作数据库时需要构造 s ...

  5. 【mybatis源码学习】mybtias一级,二级缓存

    转载:https://www.cnblogs.com/ysocean/p/7342498.html mybatis 为我们提供了一级缓存和二级缓存,可以通过下图来理解: ①.一级缓存是SqlSessi ...

  6. MyBatis(七):MyBatis缓存详解(一级缓存/二级缓存)

    一级缓存 ​ MyBatis一级缓存上SqlSession缓存,即在统一SqlSession中,在不执行增删改操作提交事务的前提下,对同一条数据进行多次查询时,第一次查询从数据库中查询,完成后会存入缓 ...

  7. mybatis 使用redis实现二级缓存(spring boot)

    mybatis 自定义redis做二级缓存 前言 如果关注功能实现,可以直接看功能实现部分 何时使用二级缓存 一个宗旨---不常变的稳定而常用的 一级是默认开启的sqlsession级别的. 只在单表 ...

  8. 阶段3 1.Mybatis_12.Mybatis注解开发_8 mybatis注解开发使用二级缓存

    执行两次都查询userId为57的数据.测试一级缓存 返回true 新建测试类 ,测试二级缓存 二级缓存的配置 首先是全局配置,不配置其实也是可以的.默认就是开启的.这里为了演示配置上 dao类里面进 ...

  9. Mybatis架构原理(二)-二级缓存源码剖析

    Mybatis架构原理(二)-二级缓存源码剖析 二级缓存构建在一级缓存之上,在收到查询请求时,Mybatis首先会查询二级缓存,若二级缓存没有命中,再去查询一级缓存,一级缓存没有,在查询数据库; 二级 ...

  10. Hibernate 再接触 一级缓存 二级缓存 查询缓存

    缓存 就是把本来应该放在硬盘里的东西放在内存里  将来存内存里读 一级缓存: session缓存 二级缓存: sessionFactory级别的   (适合经常访问,数据量有限,改动不大) 很多的se ...

随机推荐

  1. django @login_required登录限制

    参考文章:https://www.cnblogs.com/wodekaifalog/p/10817275.html 我们在网站开发过程中,经常会遇到这样的需求: 用户登陆系统才可以访问某些页面 如果用 ...

  2. ESA2GJK1DH1K基础篇: STM32+GPRS(AT指令版)实现MQTT源码讲解(支持Air202,SIM800)

    前言 注: 本程序发送心跳包,发送温湿度,返回控制数据这三个发送是单独的,有可能凑到一起发. 由于本身程序就是复杂性的程序,所以这节程序没有使用中断发送,没有使用环形队列发送,为了避免多条消息可能凑到 ...

  3. Linux进程通信的几种方式总结

    进程通信的目的 数据传输 一个进程需要将它的数据发送给另一个进程,发送的数据量在一个字节到几M字节之间 共享数据 多个进程想要操作共享数据,一个进程对共享数据 通知事 一个进程需要向另一个或一组进程发 ...

  4. Linux终端图形库编程

    /* *drawWin.c */ #include<stdio.h> #include<stdlib.h> #include<string.h> #include& ...

  5. c++primer(第五版) 阅读笔记

    快速阅读一遍c++ primer,复习c++ 1.本书代码:http://www.informit.com/store/c-plus-plus-primer-9780321714114 2.本书结构:

  6. 第6课 nullptr_t和nullptr

    一. nullptr与nullptr_t (一)nullptr_t是一种数据类型,而nullptr是该类型的一个实例.通常情况下,也可以通过nullptr_t类型创建另一个新的实例. (二)所有定义为 ...

  7. 您访问的URL地址不被允许。

    访问一个网站在一定时间内的频率过高会被当做攻击网站的行为,然后会被该网站限制访问,再次访问该网站便会出现以下界面,解决办法有: ①更改自己电脑的IP地址 ②换一个设备访问,比如把用电脑访问换成用手机访 ...

  8. Nginx通过geo模式实现限速白名单和全局负载均衡 - 运维笔记

    Nginx的geo模块不仅可以有限速白名单的作用,还可以做全局负载均衡,可以要根据客户端ip访问到不同的server.比如,可以将电信的用户访问定向到电信服务器,网通的用户重 定向到网通服务器”,从而 ...

  9. Python 的文件保存路径

    1.保存在当前代码同级的目录下: 2.保存在代码文件夹外面一层的新文件夹(data文件夹与代码文件夹同级)里: 3.保存在下一级的子文件夹里

  10. storm并行

    Storm并行度 wordcount 统计job代码 public class WordCountTopology { private static final String SENTENCE_SPO ...