一 .概述

先讲缓存实现,主要是mybatis一级缓存,二级缓存及缓存使用后续补充

Mybatis缓存的实现是基于Map的,从缓存里面读写数据是缓存模块的核心基础功能;
除核心功能之外,有很多额外的附加功能,如:防止缓存击穿,添加缓存清空策略(fifo、lru)、序列化功
能、日志能力、定时清空能力等;
附加功能可以以任意的组合附加到核心基础功能之上,怎么样优雅的为核心功能添加附加能力?使用继承的办法扩展附加功能?

继承的方式是静态的,用户不能控制增加行为的方式和时机另外,新功能的存在多种组合,使用继承可能导致大量子类存。

装饰器模式是一种用于代替继承的技术,无需通过继承加子类就能扩展对象的新功能。使用对象的关联关系代继承关系,更加灵活,同时避免类型体系的快速。

二.设计模式

装饰器模式uml类图

举例:IO中输入流和输出流的设计BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(new FileInputStream("c://a.txt"))

三.MyBatis静态组件之缓存

cache类定义了缓存的一些基本操作接口。

cache基本操作的具体实现。

在缓存基本实现类PerpetualCache的基础上,创建了不同的装饰器对缓存进行了功能的增强,例如BlockingCache实现的是阻塞的缓存,FifoCache使用先进先出策略,ScheduledCache定时清空缓存,现在以

BlockingCache为例说明mybatis缓存的具体实现。

BlockingCache锁机制可以作为一种防止缓存雪崩和缓存击穿的重要手段

CacheKey解读

Mybatis中涉及到动态SQL的原因,缓存项的key不能仅仅通过一个String来表示,所以通过CacheKey来封装缓存的Key值,CacheKey可以封装多个影响缓存项的因素;判断两个CacheKey是否相同关键是比较两个对象的hash值是否一致;

Mybatis通过上述算法确定cacheKey是否一致,mybatis在查询数据库之前,回先查询缓存,同时调用生成cacheKey的算法,通过下列源码可知影响缓存的因素包括

mappedStatment的id

指定查询结果集的范围(分页信息)

查询所使用的SQL语句

用户传递给SQL语句的实际参

总结:

mybatis缓存使用了装饰器模式,对基本缓存功能做了不同的程度,不同方向上的增强,同时通过cacheKey的源码分析,了解到影响缓存key的因素包括

mappedStatment的id

指定查询结果集的范围(分页信息)

查询所使用的SQL语句

用户传递给SQL语句的实际参

myBatis组件之缓存实现及使用的更多相关文章

  1. Spring Boot + Mybatis + Redis二级缓存开发指南

    Spring Boot + Mybatis + Redis二级缓存开发指南 背景 Spring-Boot因其提供了各种开箱即用的插件,使得它成为了当今最为主流的Java Web开发框架之一.Mybat ...

  2. Mybatis之一级缓存(七)

    1. 介绍 Mybatis缓存分为一级缓存和二级缓存,在本节中我们介绍下一级缓存的使用及其特性 MyBatis的一级缓存是在一个Session域内有效的,当Session关闭后,缓存内容也随之销毁.缓 ...

  3. [原创]关于mybatis中一级缓存和二级缓存的简单介绍

    关于mybatis中一级缓存和二级缓存的简单介绍 mybatis的一级缓存: MyBatis会在表示会话的SqlSession对象中建立一个简单的缓存,将每次查询到的结果结果缓存起来,当下次查询的时候 ...

  4. MyBatis学习--查询缓存

    简介 以前在使用Hibernate的时候知道其有一级缓存和二级缓存,限制ORM框架的发展都是互相吸收其他框架的优点,在Hibernate中也有一级缓存和二级缓存,用于减轻数据压力,提高数据库性能. m ...

  5. Mybatis的二级缓存配置

    一个项目中肯定会存在很多共用的查询数据,对于这一部分的数据,没必要每一个用户访问时都去查询数据库,因此配置二级缓存将是非常必要的.  Mybatis的二级缓存配置相当容易,要开启二级缓存,只需要在你的 ...

  6. 使用Redis做MyBatis的二级缓存

    使用Redis做MyBatis的二级缓存 通常为了减轻数据库的压力,我们会引入缓存.在Dao查询数据库之前,先去缓存中找是否有要找的数据,如果有则用缓存中的数据即可,就不用查询数据库了. 如果没有才去 ...

  7. mybatis0210 mybatis和ehcache缓存框架整合

    .1mybatis和ehcache缓存框架整合 一般不用mybatis来管理缓存而是用其他缓存框架在管理缓存,因为其他缓存框架管理缓存会更加高效,因为别人专业做缓存的而mybatis专业做sql语句的 ...

  8. MyBatis延迟加载和缓存

    一.延迟加载 1.主对象的加载: 根本没有延迟的概念,都是直接加载. 2.关联对象的加载时机: 01.直接加载: 访问主对象,关联对象也要加载 02.侵入式延迟: 访问主对象,并不加载关联对象 访问主 ...

  9. SSM-MyBatis-17:Mybatis中一级缓存(主要是一级缓存存在性的证明,增删改对一级缓存会造成什么影响)

    ------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥------------- 缓存------------------------------------------> 很熟悉的一个 ...

随机推荐

  1. Delphi - 10.1编译OSX10.12程序遇到错误解决了!

    昨天,尝试Delphi的跨平台开发功能,在windows10下,做了一个控制台程序,发布目标平台是OSX10.12,中间配置过程都非常顺利,没有任何错误,但是当编译运行时候出现下面错误: [dccos ...

  2. Codeforces Round #439 (Div. 2) A B C

    强哉qls,这场div2竟是其出的!!! A. The Artful Expedient 暴力 ^ ,判断是否出现,有大佬根据亦或的性质推出 Karen 必赢,太强啦23333333333333. # ...

  3. 萝卜保卫战3内购破解+Toast窗口增加(Love版)

    涉及到一些不同的破解的方法,以及不同的破解思路,还有一些重要权限的删除等. 作者:HAI_ 这次目标是经常玩的萝卜保卫战,不知不觉,已经更新到3了.详细分析请参考https://bbs.ichunqi ...

  4. JS 对象 合并

    来自:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Object/assign#Sy ...

  5. linux crontab 实现每秒执行的实例

    linux crontab 命令,最小的执行时间是一分钟.如需要在小于一分钟内重复执行,可以有两个方法实现. 1.使用延时来实现每N秒执行 原理:通过延时方法 sleep N  来实现每N秒执行. 创 ...

  6. JavaScript 之基础知识

    JavaScript 基础知识 JavaScript 是属于网络的脚本语言! JavaScript 被数百万计的网页用来改进设计.验证表单.检测浏览器.创建cookies,以及更多的应用. JavaS ...

  7. 基于ajax 的 几个例子 session ,ajax 实现登录,验证码 ,实现ajax表单展示

    headers: {"X-CSRFToken": $("[name='csrfmiddlewaretoken']").val()},data:$(". ...

  8. Docker学习--docker的基本认识

    1.Docker 架构 Docker 使用客户端-服务器 (C/S) 架构模式,使用远程API来管理和创建Docker容器. Docker 容器通过 Docker 镜像来创建. 容器与镜像的关系类似于 ...

  9. Tomcat发生java.lang.OutOfMemoryError: PermGen space的解决方案

    产生该问题的主要原因是JVM永久带空间不足导致的,可以在环境变量CATALINA_OPTS中提高MaxPermSize参数值   set CATALINA_OPTS = -XX:PermSize=12 ...

  10. (转)mysql的sql_mode合理设置

    mysql的sql_mode合理设置 目录          http://xstarcd.github.io/wiki/MySQL/MySQL-sql-mode.html http://dev.my ...