一、缓存机制

使用缓存可以使应用更快地获取数据,避免频繁的数据库交互操作,尤其是在查询越多,缓存命中率越高 的情况下,缓存的作用就越明显.

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)的更多相关文章

  1. Mybatis学习(五)————— 延迟加载和缓存机制(一级二级缓存)

    一.延迟加载 延迟加载就是懒加载,先去查询主表信息,如果用到从表的数据的话,再去查询从表的信息,也就是如果没用到从表的数据的话,就不查询从表的信息.所以这就是突出了懒这个特点.真是懒啊. Mybati ...

  2. Mybatis(五) 延迟加载和缓存机制(一级二级缓存)

    踏踏实实踏踏实实,开开心心,开心是一天不开心也是一天,路漫漫其修远兮. --WH 一.延迟加载 延迟加载就是懒加载,先去查询主表信息,如果用到从表的数据的话,再去查询从表的信息,也就是如果没用到从表的 ...

  3. mybatis学习--缓存(一级和二级缓存)

    声明:学习摘要! MyBatis缓存 我们知道,频繁的数据库操作是非常耗费性能的(主要是因为对于DB而言,数据是持久化在磁盘中的,因此查询操作需要通过IO,IO操作速度相比内存操作速度慢了好几个量级) ...

  4. hibernate缓存机制详细分析(一级、二级、查询缓存,非常清晰明白)

    本篇随笔里将会分析一下hibernate的缓存机制,包括一级缓存(session级别).二级缓存(sessionFactory级别)以及查询缓存,当然还要讨论下我们的N+1的问题. 随笔虽长,但我相信 ...

  5. mybatis缓存机制

    目录 mybatis缓存机制 Executor和缓存 一级缓存 小结 二级缓存 小结 mybatis缓存机制 mybatis支持一.二级缓存来提高查询效率,能够正确的使用缓存的前提是熟悉mybatis ...

  6. Mybatis的一级缓存机制简介

    1.接口 public interface MemberMapperCache { public Members selectMembersById(Integer id); } 2.配置文件xml ...

  7. MyBatis - 5.缓存机制

    MyBatis 包含一个非常强大的查询缓存特性,它可以非常方便地配置和定制.缓存可以极大的提升查询效率. MyBatis系统中默认定义了两级缓存. 一级缓存和二级缓存. 1.默认情况下,只有一级缓存( ...

  8. mybati缓存机制之一级缓存

      在月黑风高的某天夜晚,boss chen语重心长的发条了消息给小草说:“小草啊,是时候写写博客来记录平常自己积累的东西了......”.小草一听,平常没有写博客的习惯,在平常开发中只是用笔记记录自 ...

  9. Spring Boot2(二):使用Spring Boot2集成Mybatis缓存机制

    前言 学习SpringBoot集成Mybatis的第二章,了解到Mybatis自带的缓存机制,在部署的时候踩过了一些坑.在此记录和分享一下Mybatis的缓存作用. 本文章的源码再文章末尾 什么是查询 ...

随机推荐

  1. [ vue ] 监听v-model数据的变化,只要有变化就改变vuex的state值

    场景描述: 1. 注册弹出框是用 v-model 绑定数据  showRegisterModal  实现的,点击遮罩层框架会把  showRegisterModal=false 2.REGISTER按 ...

  2. BIO、NIO、AIO --- 个人理解

    1.前言 什么是 BIO.NIO.AIO  ,不难看出,都是共同的字符IO , IO的意思是input output  ,即输入输出 , 那么 B . N .A 分别指不同的io模型 ,而io又分为 ...

  3. spring security 在controller层 方法级别使用注解 @PreAuthorize("hasRole('ROLE_xxx')")设置权限拦截 ,无权限则返回403

    1.前言 以前学习的时候使用权限的拦截,一般都是对路径进行拦截 ,要么用拦截器设置拦截信息,要么是在配置文件内设置拦截信息, spring security 支持使用注解的形式 ,写在方法和接口上拦截 ...

  4. spring security 继承 WebSecurityConfigurerAdapter 的重写方法configure() 参数 HttpSecurity 常用方法及说明

    HttpSecurity 常用方法及说明 方法 说明 openidLogin() 用于基于 OpenId 的验证 headers() 将安全标头添加到响应 cors() 配置跨域资源共享( CORS ...

  5. 端口状态 LISTENING、ESTABLISHED、TIME_WAIT及CLOSE_WAIT详解,以及三次握手四次挥手,滑动窗口(整理转发)

    网上查了一下端口状态的资料,我下面总结了一下,自己学习学习: TCP状态转移要点 TCP协议规定,对于已经建立的连接,网络双方要进行四次握手才能成功断开连接,如果缺少了其中某个步骤,将会使连接处于假死 ...

  6. 性能优化-使用双buffer实现无锁队列

    借助本文,实现一种在"读多写一"场景下的无锁实现方式 在我们的工作中,多线程编程是一件太稀松平常的事.在多线程环境下操作一个变量或者一块缓存,如果不对其操作加以限制,轻则变量值或者 ...

  7. 极简promise雏形

    function Promise(fn) { var value = null, callbacks = []; //callbacks为数组,因为可能同时有很多个回调 this.then = fun ...

  8. 【Android】安卓开发中的布局与事件

    [Android]安卓开发中的布局与事件 1.Android Studio下载配置 非常简单的百度然后点击下载安装就好了.注意的是,本来我是打算使用评价还不错的Genymotion这个软件来充当虚拟机 ...

  9. C# 文件对话框例子

    OpenFileDialog控件的基本属性InitialDirectory:对话框的初始目录 Filter: 获取或设置当前文件名筛选器字符串,例如,"文本文件(*.txt)|*.txt|所 ...

  10. Python向mysql数据库插入数据

    一.向表tcolor中插入数据的主要流程如下: import datetimeimport pymysql.cursorsconnection = pymysql.connect(host='loca ...