MyBatis_查询缓存01
一、查询缓存
查询缓存的使用,主要是为了提高查询访问速度。将用户对同一数据的重复查询过程简单化,不在每次均从数据库中查询获取结果数据,从而提高访问速度。
MyBatis的查询缓存机制,根据缓存区的作用域与生命周期,可划分为两种:一级缓存和二级缓存。
MyBatis查询缓存的作用域是根据映射文件mapper的namespace划分的,相同namespace的mapper查询数据存放在同一个缓存区域。不同的namespace下的数据互不干扰。无论是一级缓存还是二级缓存,都是按照namespace进行分别存放的。
但一、二级缓存的不同之处在于,SqlSession一旦关闭,则SQLSession中的数据将不存在,即一级缓存就不存在,而二级缓存的生命周期会与整个应用同步,与SQLSession是否关闭无关。
简单的说,一级缓存是在同一线程(同一SQLSession)间共享数据,而二级缓存是在不同线程间共享数据。
二、一级缓存的证明
三、从缓存中查找数据的依据
MyBatis的查询依据是:Sql的id+SQL语句。
Hibernate的查依据是:查询结果对象的id。
缓存的底层实现是一个Map,Map的value是查询结果。Map的key,即查询依据,使用的ORM架构不同,查询依据就不不同。
ORM:
四、增删改对一级缓存的影响
1 @Test 2 public void test03() { 3 Student student = dao.selectStudentById(197); 4 System.out.println(student); 5 //增删改操作都会清空一级缓存 6 dao.insertStudent(new Student("阿古斯",26,96.5)); 7 Student student1 = dao.selectStudentById(197); 8 System.out.println(student1); 9 }
输出:
0 [main] DEBUG com.jmu.dao.IStudentDao.selectStudentById - ==> Preparing: select id,name,age,score from student where id=? 75 [main] DEBUG com.jmu.dao.IStudentDao.selectStudentById - ==> Parameters: 197(Integer) 116 [main] TRACE com.jmu.dao.IStudentDao.selectStudentById - <== Columns: id, name, age, score 116 [main] TRACE com.jmu.dao.IStudentDao.selectStudentById - <== Row: 197, 明明, 19, 87.9 120 [main] DEBUG com.jmu.dao.IStudentDao.selectStudentById - <== Total: 1 Student [id=197, name=明明, score=87.9, age=19] 121 [main] DEBUG com.jmu.dao.IStudentDao.insertStudent - ==> Preparing: insert into student(name,age,score) values(?,?,?) 122 [main] DEBUG com.jmu.dao.IStudentDao.insertStudent - ==> Parameters: 阿古斯(String), 26(Integer), 96.5(Double) 123 [main] DEBUG com.jmu.dao.IStudentDao.insertStudent - <== Updates: 1 124 [main] DEBUG com.jmu.dao.IStudentDao.selectStudentById - ==> Preparing: select id,name,age,score from student where id=? 124 [main] DEBUG com.jmu.dao.IStudentDao.selectStudentById - ==> Parameters: 197(Integer) 124 [main] TRACE com.jmu.dao.IStudentDao.selectStudentById - <== Columns: id, name, age, score 125 [main] TRACE com.jmu.dao.IStudentDao.selectStudentById - <== Row: 197, 明明, 19, 87.9 125 [main] DEBUG com.jmu.dao.IStudentDao.selectStudentById - <== Total: 1 Student [id=197, name=明明, score=87.9, age=19]
结论:增删改操作都会清空一级缓存,无论是否提交
首先,证明二级缓存的存在。
因为SqlSession一旦关闭,一级缓存就不存在,而二级缓存的生命周期会与整个应用同步,与SQLSession是否关闭无关。
sqlSession.close();
开启内置的二级缓存步骤:
- 对实体进行序列化
- 在映射文件中添加<cache/>标签;
缓存命中率:
【DEBUG】 Cache Hit Ratio:0.5
(2)增删改对二级缓存的影响
1 public void test01() { 2 sqlSession = MybatisUtils.getSqlSession(); 3 dao = sqlSession.getMapper(IStudentDao.class); 4 Student student = dao.selectStudentById(197); 5 System.out.println(student); 6 7 sqlSession.close(); 8 9 sqlSession = MybatisUtils.getSqlSession(); 10 dao = sqlSession.getMapper(IStudentDao.class); 11 12 dao.insertStudent(new Student("",0,0)); 13 14 Student student1 = dao.selectStudentById(197); 15 System.out.println(student1); 16 }
上面的例子说明:
- 增删改同样会清空二级缓存;
- 对于二级缓存的清空,实际上是对所查找key对应的value置为null,而非将<key,value>对,即Entry对象删除
- 从DB中重新进行select查询的条件是:A、缓存中根本不存在这个key;B、缓存中存在改key所对应的Entry对象,但其value为null
(3)二级缓存的配置
- size:二级缓存中可以存放的最多对象个数,默认为1024个。(实际上就是HashMap的长度,可以放多少Entry对象)
- eviction:逐出策略。当二级缓存中的对象达到最大值时,就需要通过逐出策略将缓存中的对象移出缓存。默认为LRU。常用的策略有:FIFO(First in First out)先进先出、LRU(Least Recently Used)未被使用时间最长的。
- flushInterval:刷新缓存的时间间隔,单位毫秒。这里的刷新缓存即清空缓存。一般不指定,即当执行增删改时刷新缓存。
- readOnly:设置缓存中数据是否只读。默认false。
(4)二级缓存的关闭
(1)全局关闭
<settings><!-- 关闭二级缓存 --><setting name="cacheEnabled" value="false" /></settings>
(2)局部关闭
(5)二级缓存的使用原则
- 多个namespace不要操作同一张表
- 不要在关联关系表上执行增删改操作(一个namespace一般对同一个表,若表间存在关联关系,也就意味着同一个表可能会出现多个namespace。若其中一个namespace对表进行增删改操作而影响到了其关联表数据,而这个关联表的数据修改之后刷新当前namespace下的二级缓存,而对另一个namespace下的二级缓存数据没有影响)
- 查询多于修改时使用二级缓存
转载于:https://www.cnblogs.com/hoje/p/8117575.html
MyBatis_查询缓存01相关推荐
- Hibernate 一级缓存,二级缓存,查询缓存
概念: 1.什么是缓存呢? 缓存:是计算机领域的概念,它介于应用程序和永久性数据存储源之间. 缓存:一般人的理解是在内存中的一块空间,可以将二级缓存配置到硬盘.用白话来说,就是一个存储数据的容器.我们 ...
- mysql缓存 碎片_Mysql查询缓存碎片、缓存命中率及Nagios监控
Mysql 的优化方案,在互联网上可以查找到非常多资料,今天对Mysql缓存碎片和命中率作了详细了解,个人作了简单整理. 一.Mysql查询缓存碎片和缓存命中率. mysql> SHOW STA ...
- MySQL高级-MySQL查询缓存优化
MySQL查询缓存优化 1 概述 2 操作流程 3 查询缓存配置 4 开启查询缓存 5 查询缓存SELECT选项 6 查询缓存失效的情况 1 概述 开启Mysql的查询缓存,当执行完全相同的SQL语句 ...
- mysql数据库查询缓存_MySQL查询缓存与数据库管理
MySQL查询缓存与数据库管理 上一篇 / 下一篇 2010-01-25 21:51:07 / 个人分类:MYSQL/Cache MySQL查询缓存 注意:查询缓存绝不返回过期数据. 如果一个表发生 ...
- 【MySQL高级】查询缓存、合并表、分区表
[1] 查询缓存 MySQL的缓存机制简单地说就是缓存SQL语句和查询的结果,如果运行相同的SQL语句,服务器会直接从缓存中取到结果,而不需要再去解析和执行SQL语句. 查询缓存会存储最新数据 ...
- Hibernate二级缓存与查询缓存的组合探究
0.前言 由于对Hibernate的二级缓存和查询缓存的区别不了解,也不知道它们起什么作用.于是动手做了一些实验,对它们的组合使用有了一个表面的认识. 1.前提 1) 不使用一级缓存(Session级 ...
- mysql query 查询失败_如何在mysql进行查询缓存及失败的解决方法
都知道函数在使用前需要弄清楚参数的属性,这样才能对函数的使用有较好的了解.有些小伙伴学习了查询缓存后,直接进行了下一步的实战操作.这里小编想提醒大家,开始操作之前一定要先设置参数,不然就会出现问题.下 ...
- mysql(五)查询缓存
mysql的逻辑架构图如下: 当开启查询缓存时,mysql会将查询结果缓存到查询缓存区域,结果对应的key是使用查询语句,数据库名称,客户端协议的版本等因素算出的一个hash值. 在下次查询时,根据一 ...
- mysql 查看某个表缓存情况_MySQL 查询缓存 QUERY_CACHE
保存查询返回的完整结果.当查询命中该缓存,MySQL会立即返回结果,跳过解析.优化和执行阶段. 官方在特定环境测试结果(官方文档中有详细说明): 1.如果对某表进行简单查询,但每次查询条件都不一样时, ...
最新文章
- cs oracle语句跟踪,Oracle执行语句跟踪 使用sql trace实现语句追踪
- leetcode 318. Maximum Product of Word Lengths | 318. 最大单词长度乘积
- 用C#做短信CMPP2.0/3.0协议 支持扩展号支持物理网卡
- hashmap删除指定key_「集合系列」- 深入浅出分析HashMap
- Git工作笔记001---Windows下安装Git Core以及TortoiseGit安装与配置
- 转储sql文件_在Linux上SQL Server中更改SQL转储文件位置
- VS2010 打包生成exe文件后 执行安装文件出现 TODO:lt;文件说明gt;已停止工作并已关闭...
- 关于数据分析师的4个你问我答,你曾有过这些困扰吗?
- 海康ps流转换h264流
- 安卓系统刷机怎么刷机_手机怎么刷机
- 3dmm计算特征向量,c++读写txt和二进制记录
- Java项目_宠物领养系统_不到一小时教会你
- 5.6 图层样式的缩放 [原创Ps教程]
- 数理统计SPSS软件实验报告一--描述性统计
- Windows中如何修改Intel网卡的注册表使Wireshark可以抓取802.1q tag包
- python实战项目词云生成器(wordcloud+jieba+pyinstaller打包)——词云生成软件【Pyinstaller打包问题解决】
- 【软考软件评测师】2020年下综合知识历年真题
- python金融分析-基于Python的金融分析与风险管理
- JAVA8 lambda表达式 对List集合去重
- spring框架xml的几种配置方式
热门文章
- 选股策略你都会吗,这些选股策略你看懂了吗?
- 情人节程序员用HTML网页表白【嫦娥奔月(满屏泡泡)】 HTML5七夕情人节表白网页源码 HTML+CSS+JavaScript
- android 微软桌面,Mirosoft Launcher微软桌面
- win10 网络重置后WIFI不见了
- Mysql语句(二)
- 虚拟主机选择_为何云虚拟主机我选择了,但企业还是不能更好地开展网站建设呢?...
- 做自媒体,宝妈萌娃类视频尤其要注意,越好的视频越有节奏感
- 小程序获取发票详情getinvoiceinfo一直报72031
- centos系统使用pptpd搭建在windows客户端的vpn服务器
- 使用rotate()来做一个3d贺卡