MyBatis加强(1)~缓存机制(一级缓存、二级缓存、第三方缓存技术redis、ehcache)
一、缓存机制
使用缓存可以使应用更快地获取数据,避免频繁的数据库交互操作,尤其是在查询越多,缓存命中率越高 的情况下,缓存的作用就越明显.
1、缓存原理:Map
■ 查询时,先从缓存区查询:找到,返回数据;找不到:到数据库中查询,然后把查询的数据放进缓存,供下次使用,然后返回数据
■ 缓存是在内存,速度肯定是比存储在磁盘的数据库更快,减轻数据库的访问压力
2、缓存相关的概念:
(1)哪一些数据适合进行缓存:经常被查询但是很少被修改的数据【读远远大于写操作的数据】
(2)缓存相关的属性:
■ 命中率:从缓存中查询出来的数量占总查询的数量
■ 最大对象数量:缓存区中最多存储多少个数据,超出的时候可以写到硬盘中【序列化】
■ 最大空闲时间:停留在缓存空间的时间,避免出现"占着茅坑不拉。。。"
● 在MyBatis中实现缓存,只需实现Cache接口即可。
3、MyBatis 缓存【一级缓存 和 二级缓存】:
✿ 一级缓存[本地缓存,默认自动开启,不能关闭,性能提升较差]:SqlSession级别的,每次创建新的SqlSession对象,一级缓存的空间就会发生改变。不同是SqlSession对象不可以共享数据。
✿ 二级缓存[查询缓存,需要手动开启和配置]:mapper级别的,作用域是mapper文件的同一个namespace。二级缓存应该和namespace绑定在一起,不同是SqlSession对象可以共享数据。
● 默认的缓存是缓存到java的进程(jvm的内存空间)中,若是缓存内容过多,会出现内存溢出(OOM),需要选择第三方的缓存技术,例如redis、ehcache。
3-1、MyBatis中一级缓存的情况:【基于SqlSession】

■ 一级缓存【本地缓存】,默认开启,不能关闭。
- 好比是在SqlSession中存在一个Map,用来缓存查询出来的对象。
■ 清空一级缓存:调用Sqlsession对象的cleanCache方法。
SqlSession session = MyBatisUtil.getSession();
//清空一级缓存
session.clearCache();
■ 一级缓存:对性能提升是有限的,每一次操作,我们都使用新的SqlSession对象,SqlSession之间不共享一级缓存。
- 真正提升性能---->二级缓存
3-2、MyBatis中二级缓存的情况:

■ 使用二级缓存的步骤:
(1) 全局配置文件中启用二级缓存:
<settings>
<!-- 启用二级缓存,缺省是默认启用 -->
<setting name="cacheEnabled" value="true"/>
</settings>
(2) mapper文件中,使用cache元素,即namespce和缓存进行绑定:
<cache/>
(3)对于要放入二级缓存的对象要实现序列化接口【因为:超出缓存范围的时候可以写到硬盘中【序列化】】
public class Employee implements Serializable{
}
■ 使用二级缓存配置的一些细节(当启用二级缓存后):
(1)mapper文件中所有select元素会默认使用缓存
(2)在大多数情况下,针对列表查询【查询多条数据】,设置为不缓存【useCache="false"】,只有sql和参数相同时,才会使用到缓存:
<!-- mapper 文件-->
<select id="listAll" resultMap="BaseResultMap" useCache="false">
select id, name, dept_id from employee2
</select>
(3)一般,对get方法设置缓存查询【useCache="true"】:
<!-- mapper 文件-->
<select id="get" resultMap="BaseResultMap" useCache="true">
select id, name, dept_id from employee2 where id = #{id}
</select>
(4)默认情况下,insert、delete、update操作都会去刷新缓存,对于删除和更改操作,刷新缓存操作是合理的,但是插入对象操作是没必要刷新缓存的
<insert id="" flushCache="false">
</insert>
4、整合第三方缓存技术
4-1、EhCache:第三方的缓存技术
(1) 依赖【注意看好版本】:
□ jar包的话---方式一:可以直接在github找到对应的项目,看readme提示去下载 zip包【就包含了所需要的jar包】
□ jar包的话---方式二:到maven仓库下载对应的jar包
- ehcache-core.jar
- mybais-ehcache.jar
- slf4j-api.jar
- slf4j-log4j.jar
(2) ehcache配置:
- ehcache配置文件:ehcache.xml
- 映射文件中通过cache元素的type设置为"org.mybatis.caches.ehcache.EhcacheCache"
<!-- 映射文件中使用Ehcache技术 -->
<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
■ 配置好后就可以直接使用啦
4-2、redis缓存中间件:第三方的缓存技术
(1) 安装redis服务 链接:https://github.com/MicrosoftArchive/redis/tags
(2) 依赖【注意看好版本】:
- mybais-redis.jar
(3) redis配置:
- ehcache配置文件:redis.properties
- 映射文件中通过cache元素的type设置为"org.mybatis.caches.redis.RedisCache"
MyBatis加强(1)~缓存机制(一级缓存、二级缓存、第三方缓存技术redis、ehcache)的更多相关文章
- Mybatis学习(五)————— 延迟加载和缓存机制(一级二级缓存)
一.延迟加载 延迟加载就是懒加载,先去查询主表信息,如果用到从表的数据的话,再去查询从表的信息,也就是如果没用到从表的数据的话,就不查询从表的信息.所以这就是突出了懒这个特点.真是懒啊. Mybati ...
- Mybatis(五) 延迟加载和缓存机制(一级二级缓存)
踏踏实实踏踏实实,开开心心,开心是一天不开心也是一天,路漫漫其修远兮. --WH 一.延迟加载 延迟加载就是懒加载,先去查询主表信息,如果用到从表的数据的话,再去查询从表的信息,也就是如果没用到从表的 ...
- mybatis学习--缓存(一级和二级缓存)
声明:学习摘要! MyBatis缓存 我们知道,频繁的数据库操作是非常耗费性能的(主要是因为对于DB而言,数据是持久化在磁盘中的,因此查询操作需要通过IO,IO操作速度相比内存操作速度慢了好几个量级) ...
- hibernate缓存机制详细分析(一级、二级、查询缓存,非常清晰明白)
本篇随笔里将会分析一下hibernate的缓存机制,包括一级缓存(session级别).二级缓存(sessionFactory级别)以及查询缓存,当然还要讨论下我们的N+1的问题. 随笔虽长,但我相信 ...
- mybatis缓存机制
目录 mybatis缓存机制 Executor和缓存 一级缓存 小结 二级缓存 小结 mybatis缓存机制 mybatis支持一.二级缓存来提高查询效率,能够正确的使用缓存的前提是熟悉mybatis ...
- Mybatis的一级缓存机制简介
1.接口 public interface MemberMapperCache { public Members selectMembersById(Integer id); } 2.配置文件xml ...
- MyBatis - 5.缓存机制
MyBatis 包含一个非常强大的查询缓存特性,它可以非常方便地配置和定制.缓存可以极大的提升查询效率. MyBatis系统中默认定义了两级缓存. 一级缓存和二级缓存. 1.默认情况下,只有一级缓存( ...
- mybati缓存机制之一级缓存
在月黑风高的某天夜晚,boss chen语重心长的发条了消息给小草说:“小草啊,是时候写写博客来记录平常自己积累的东西了......”.小草一听,平常没有写博客的习惯,在平常开发中只是用笔记记录自 ...
- Spring Boot2(二):使用Spring Boot2集成Mybatis缓存机制
前言 学习SpringBoot集成Mybatis的第二章,了解到Mybatis自带的缓存机制,在部署的时候踩过了一些坑.在此记录和分享一下Mybatis的缓存作用. 本文章的源码再文章末尾 什么是查询 ...
随机推荐
- Log4j2进阶使用(Pattern Layout详细设置)
1.进阶说明 通过配置Layout打印格式化的日志, Log4j2支持很多的Layouts: CSV GELF HTML JSON Pattern Serialized Syslog XML YAML ...
- CentOS8.2安装docker
1:安装docker前准备docker配置仓库(安装yum-utils是提供一个yum-config-manager单元,同时安装的device-mapper-persistent-data和lvm2 ...
- TypeScript 中文教程之缩小----部分翻译自TS官方
Narrowing概念:字面意思是缩小,可以理解为细化或者您觉得更好的代名词. TS官方在这里做了很详细的说明,文字较多,简单以图片概括: typeof type guards 类型防护过程,可以通 ...
- 新装CentOS7用yum安装软件提示 cannot find a valid baseurl for repobase7x86_64
1.打开网络配置文件:vi /etc/sysconfig/network-scripts/ifcfg-ens33(每个机子都可能不一样,但格式会是"ifcfg-e..."). 2. ...
- node之module与fs文件系统
命令行窗口(小黑屏).cmd窗口.终端.shell 开始菜单 --> 运行 --> CMD --> 回车 常用的指令: dir 列出当前目录下的所有文件 cd 目录名 进入到指定的目 ...
- JuiceFS 即将发布 1.0 并调整开源许可
开源一周年 JuiceFS 开始于 2017 年,是一款云原生分布式文件系统,旨在帮助企业解决多云.跨云.混合云环境下所面临的诸多挑战:数据安全和保护.大数据架构升级.海量小文件访问.Kubernet ...
- Python网络编程之网络基础
Python网络编程之网络基础 目录 Python网络编程之网络基础 1. 计算机网络发展 1.1. OSI七层模型 1.2. 七层模型传输数据过程 2. TCP/IP协议栈 2.1 TCP/IP和O ...
- kafka时间轮简易实现(二)
概述 上一篇主要介绍了kafka时间轮源码和原理,这篇主要介绍一下kafka时间轮简单实现和使用kafka时间轮.如果要实现一个时间轮,就要了解他的数据结构和运行原理,上一篇随笔介绍了不同种类的数据结 ...
- Keil MDK STM32系列(七) STM32F4基于HAL的PWM和定时器
Keil MDK STM32系列 Keil MDK STM32系列(一) 基于标准外设库SPL的STM32F103开发 Keil MDK STM32系列(二) 基于标准外设库SPL的STM32F401 ...
- 如何更改Docker已经挂载的目录
更改docker已经挂载的目录,主要有两种方式:一是重新创建容器,二是更改配置文件.第一种方式较为简单,下面具体演示第二种方式,通过更改配置文件来更换目录 挂载. 安装docker yum -y in ...