myBatis组件教程之缓存的实现与使用

一 .概述

先讲缓存实现,主要是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语句的实际参

好了,以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对我们的支持。

(0)

相关推荐

  • 详解Mybatis的二级缓存配置

    一个项目中肯定会存在很多共用的查询数据,对于这一部分的数据,没必要 每一个用户访问时都去查询数据库,因此配置二级缓存将是非常必要的. Mybatis的二级缓存配置相当容易,要开启二级缓存,只需要在你的Mapper 映射文件中添加一行: <cache /> 它将采用默认的行为进行缓存: 映射文件中所有的select语句将被缓存 映射文件中所有的insert.update和delete语句将刷新缓存 缓存将使用LRU(Least Recently Used)最近最少使用策略算法来回收 刷新间隔(n

  • mybatis中的缓存问题解析

    关于mybatis基础我们前面几篇博客已经介绍了很多了,今天我们来说一个简单的问题,那就是mybatis中的缓存问题.mybatis本身对缓存提供了支持,但是如果我们没有进行任何配置,那么默认情况下系统只开启了一级缓存,一级缓存就是同一个SqlSession执行的相同查询是会进行缓存的,OK,那么今天我们就来看看这些缓存,并简单验证下. 系统默认开启了一级缓存 这个缓存系统默认情况下是开启的,当我们获取到一个SqlSession对象之后,如果调用SqlSession中的同一个方法查询同一条数据,

  • MyBatis高级映射和查询缓存

     mybatis框架执行过程: 1.配置mybatis的配置文件,SqlMapConfig.xml(名称不固定) 2.通过配置文件,加载mybatis运行环境,创建SqlSessionFactory会话工厂 SqlSessionFactory在实际使用时按单例方式. 3.通过SqlSessionFactory创建SqlSession SqlSession是一个面向用户接口(提供操作数据库方法),实现对象是线程不安全的,建议sqlSession应用场合在方法体内. 4.调用sqlSession的方

  • MyBatis查询缓存实例详解

    查询缓存的使用,主要是为了提高查询访问速度.将用户对同一数据的重复查询过程简化,不再每次均从数据库查询获取结果数据,从而提高访问速度. MyBatis的查询缓存机制,根据缓存区的作用域(生命周期)可划分为两种:一级缓存与二级缓存 一.一级查询缓存 MyBatis一级缓存是基于org.apache.ibatis.cache.impl.PerpetualCache类的HashMap本地缓存,其作用域是Sqlsession.在同一个Sqlsession中两次执行相同的sql语句,第一次执行完毕后,会将

  • MyBatis关于二级缓存问题

    MyBatis提供一级缓存和二级缓存,其中一级缓存是sqlSession级别的缓存,不同的sqlSession之间的缓存互不影响.二级缓存是Mapper级别的缓存,多个sqlSession操作同一个Mapper,其二级缓存是可以共享的. MyBatis有多种二级缓存方案可供选择.其中对Memcached的支持较为成熟,现以Memcached为例介绍与spring项目的集成. 使用配置 配置pom.xml,添加依赖. <dependencies> ... <dependency> &

  • 详解Java的MyBatis框架中的缓存与缓存的使用改进

    一级缓存与二级缓存 MyBatis将数据缓存设计成两级结构,分为一级缓存.二级缓存: 一级缓存是Session会话级别的缓存,位于表示一次数据库会话的SqlSession对象之中,又被称之为本地缓存.一级缓存是MyBatis内部实现的一个特性,用户不能配置,默认情况下自动支持的缓存,用户没有定制它的权利(不过这也不是绝对的,可以通过开发插件对它进行修改): 二级缓存是Application应用级别的缓存,它的是生命周期很长,跟Application的声明周期一样,也就是说它的作用范围是整个App

  • 详解Spring boot使用Redis集群替换mybatis二级缓存

    1 . pom.xml添加相关依赖 <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.5.1.RELEASE</version> </parent> <!-- 依赖 --> <dependencies> &l

  • 深入理解MyBatis中的一级缓存与二级缓存

    前言 先说缓存,合理使用缓存是优化中最常见的,将从数据库中查询出来的数据放入缓存中,下次使用时不必从数据库查询,而是直接从缓存中读取,避免频繁操作数据库,减轻数据库的压力,同时提高系统性能. 一级缓存 一级缓存是SqlSession级别的缓存.在操作数据库时需要构造sqlSession对象,在对象中有一个数据结构用于存储缓存数据.不同的sqlSession之间的缓存数据区域是互相不影响的.也就是他只能作用在同一个sqlSession中,不同的sqlSession中的缓存是互相不能读取的. 一级缓

  • 深入理解Mybatis二级缓存

    上篇文章给大家介绍了mybatis一级缓存,有需要的朋友可以参考下. 与一级缓存相比,二级缓存范围更大了一些,可以被多个SqlSession所共用. 同样是发送同样的查询sql会先去缓存中找,找不到再去查询数据库. 每个namespace的mapper都会有自己的一个缓存的空间. 如果两个mapper的namespace相同,执行mapper查询到的数据将存储到相同的二级缓存. 同样如果有sqlSession执行了commit 会清空二级缓存. 配置文件(不用配置也是默认开启的): 在sqlMa

  • 深入理解Mybatis一级缓存

    客户端向数据库服务器发送同样的sql查询语句,如果每次都去访问数据库,会导致性能的降低. 那么怎么提高呢? mybatis为我们提供了一级缓存的策略 在一个sqlSession开启和关闭之间,sqlSession对象内部(其实是Executor)会维护一个缓存的对象,当查询数据时候,先从缓存中寻找是否存在该条数据,存在就直接取出来,不存在,向数据库发送sql查询, 然后将查询后的数据存入缓存,和返回给程序. 这样会存在一个问题: 如果在第一次和第二次查询期间,有程序更改了要查讯的数据库的数据,就

随机推荐