mybatis缓存

  系统缓存:常用的一级缓存和二级缓存

一级缓存

  一级缓存是SqlSession级别的缓存,在操作数据库时需要构建SqlSession对象,在对象中有一个数据结构用于存储缓存数据。不同的SqlSession之间的缓存数据区域是互相不影响的。也就是只能作用在一个SqlSession对象中,不同SqlSession之间的缓存数据是互相不能读取的。

   一级缓存的工作原理

  

  口述介绍:

  当用户A发起请求查询一条记录时,SqlSession会先从缓存中读取数据,如果存在就读取,如果不存在就从数据库获取数据。

  SqlSession执行commit操作时,会清空一级缓存。这么做是为了避免脏读。

  

  注:如果commit不清空缓存,会出现错误。例如:当用户A查询某件商品还有10件,并将10件商品缓存在一级缓存中,之后被客户买走10件,数据被delete掉,但下次查询这件商品是从缓存中获取。就会出现脏数据。

  spring中整合的mybatis

  spring将事务放在Service中管理,对于每一个service中的SqlSession是不同的,这是通过mybatis-spring中的org.spring.mapper.MapperScannerConfigurer创建SqlSession自动注入到Service中的,每次查询之后都要关闭SqlSession,关闭之后数据会被清空,所以spring整合之后如果没有事务支持,一级缓存是没有意义的。

  二级缓存

    二级缓存的工作原理

  

    口述介绍:

    二级缓存是mapper级别的缓存,多个sql'Session去操作同一个mapper的sql语句,多个SqlSession可共用同一个二级缓存,二级缓存是跨SqlSession的。

   每一个mapper都有一个二级缓存区域(按照namespace区分),每一个namespace的mapper都有二级缓存区域,两个mapper的namespace相同,这两个mapper执行的Sql查询数据存储在同一个二级缓存区域。

    

   开启二级缓存

    1.打开总开关:

    在mybatis的xml文件中加入:

    <settings>

      <setting name="cacheEnabled" value="true"/>

    <settings/>

    2.在需要开启二级缓存的mapper.xml文件中引入<cache />

    3.让使用二级缓存的POJO类实现Serializable(序列化)接口

    注:springboot中默认开启了全局二级缓存,如果使用二级缓存需要在mapper上注明。@CacheNamespace

    总结:

    好处:对于查询多,commit操作少的。用户对查询条件实时性数据要求不高,采用二级缓存可以降低数据库访问量,提高数据库访问性能。

    弊端:二级缓存是建立在一个namespace下的,如果是多个namespace那么数据可能是错误的。

      

     举例说明:

    部门和部门员工,部门存储在部门的二级缓存下,部门员工存储在部门员工的二级缓存下。如果有人对部门信息进行修改,那么影响的就只有部门的二级缓存,如果在进行查询时,部门员工信息时从部门员工的二级缓存中获取的。这时候的数据是已经过时的。

    使用二级缓存的问题:

    对该表的操作都是同一个namespace下,其他namespace如果有操作就会发生脏读。

    对关联表的操作,关联表的所有表的操作都必须在同一个namespace下操作。

Mybatis缓存1----系统缓存及简单配置介绍的更多相关文章

  1. Mybatis缓存(1)--------系统缓存及简单配置介绍

    前言 Mybatis的缓存主要有两种: 系统缓存,也就是我们一级缓存与二级缓存: 自定义的缓存,比如Redis.Enhance等,需要额外的单独配置与实现,具体日后主要学习介绍. 在这里主要记录系统缓 ...

  2. CCNA网络工程师学习进程(6)vlan相关协议的配置与路由器简单配置介绍

        前面已经介绍了大部分与vlan技术相关的交换机的协议的配置,更深层次的还有STP协议和以太网端口聚合技术,接着还会简单介绍一下路由器的基本应用.     (1)STP(Spanning-tre ...

  3. windows系统常用软件及配置介绍

    常用工具 ,,,, 开发工具 ,,, 快捷键 ... 等等 vvv 等等

  4. centos7防火墙的简单配置介绍

    centos7版本 1.查看已开放的端口(默认不开放任何端口) firewall-cmd --list-ports 2.开启80端口 firewall-cmd --zone=public(作用域) - ...

  5. C# 嵌入dll 动软代码生成器基础使用 系统缓存全解析 .NET开发中的事务处理大比拼 C#之数据类型学习 【基于EF Core的Code First模式的DotNetCore快速开发框架】完成对DB First代码生成的支持 基于EF Core的Code First模式的DotNetCore快速开发框架 【懒人有道】在asp.net core中实现程序集注入

    C# 嵌入dll   在很多时候我们在生成C#exe文件时,如果在工程里调用了dll文件时,那么如果不加以处理的话在生成的exe文件运行时需要连同这个dll一起转移,相比于一个单独干净的exe,这种形 ...

  6. host缓存,浏览器缓存---解决host缓存带来的伤

    1.缓存 缓存,对应工程师来讲简直太熟悉了,太方便了,省略到资源或数据的获取方式,直接缓存到离用户访问最快的地方,也降低服务器的压力,比如: (1)静态文件获取 服务器->cdn->本地磁 ...

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

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

  8. 关于mybatis中一级缓存和二级缓存的简单介绍

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

  9. mybatis(4)_二级缓存深入_使用第三方ehcache配置二级缓存

    增删改对二级缓存的影响 1.增删改也会清空二级缓存 2.对于二级缓存的清空实质上是对value清空为null,key依然存在,并非将Entry<k,v>删除 3.从DB中进行select查 ...

随机推荐

  1. Java业务代理模式~

    业务代理模式用于解耦表示层和业务层. 它基本上用于减少表示层代码中的业务层代码的通信或远程查找功能.在业务层有以下实体. 客户端(Client) - 表示层代码可以是JSP,servlet或UI ja ...

  2. java反射(四)--反射与简单java类

    一.传统简单java类 简单的java类主要是由属性所组成,并且提供有相应的setter以及getter的处理方法,同时简单java类最大的特征就是通过对象保存相应的类的属性内容,但是如果使用传统的简 ...

  3. luoguP2184 贪婪大陆 题解(树状数组)

    P2184 贪婪大陆  题目 其实很容易理解就是询问一段区间内有多少段不同的区间 然后再仔细思索一下会发现: 1.只要一个区间的开头在一个节点i的左边,那么这个区间包含在区间1~i中. 2.只要一个区 ...

  4. js 可迭代对象

    作用:可以简化使用循环语句初始化一个变量记录迭代位置的操作 function createIterator(iterms) { let i = 0 return { next() { let done ...

  5. WPF 基本图形

    一.WPF的基本图形 WPF图形的基类是Shape,所有的wpf图形类都是继承于Shape.Height,Width等决定它所处的面积,位置等,在没有设置图形宽高的情况,坐标位置为所在的容器的坐标,设 ...

  6. spring 事物(二)—— 编程式事物实现与扩展

    简介 使用TransactionTemplate 不需要显式地开始事务,甚至不需要显式地提交事务.这些步骤都由模板完成.但出现异常时,应通过TransactionStatus 的setRollback ...

  7. 【记录】Mysql 建表注意事项

    博主最近打算搭建商城,由于之前对建表只有很浅显的理解,没有太过深入了解,建表过程中遇到一些问题,现记录如下, 如有问题请各位留言指正,感激不尽: 建表时设置如何设置联合主键?如下标红处: CREATE ...

  8. Ubuntu中实现Docker内安装jenkins+jenkins远程触发

    前面做了在ubuntu中安装jenkins+docker实现自动部署,但是得安装jdk8+tomcat8环境,比较麻烦,因此本文记录如何将jenkins直接装在dockers内并且实现远程触发功能. ...

  9. translation of 《deep learning》 Chapter 1 Introduction

    原文: http://www.deeplearningbook.org/contents/intro.html Inventors have long dreamed of creating mach ...

  10. UOJ197 线性规划

    传送门 由于这道题标程GG了所以必不可能AC嘛2333 单纯形法是一个很玄学的东西qwq 就是 非标准型 -> 标准型 -> 规范型 -> 松弛型 一个玄学操作——转轴操作(priv ...