MyBatis缓存技术(一级缓存、二级缓存)

MyBatis的缓存分类

一级缓存

一级缓存的作用域是一个SqlSession。MyBatis默认开启一级缓存。在同一个SqlSession中,执行相同的查询SQL,第一次会查询数据库,并写到缓存中;第二次直接从缓存中读取。当执行SQL时,两次查询中间发生了增、删、改的操作,则SqlSession的缓存会被清空。

二级缓存

二级缓存的作用域是一个namesp下的mapper映射文件内容,可以多个SqlSession共享。MyBatis需要手动设置启动二级缓存(在SQLConfig中配置setting标签)。在同一个namespace下的mapper文件中,执行相同的SQL,第一次会去查询数据库,并写到缓存中;第二次直接从缓存中取。当执行SQL时,两次查询中间发生了增、删、改的操作,则二级缓存清空。

MyBatis缓存原理

一级缓存

一级缓存是根据SqlSession为单位划分的。每次查询会先去缓存中找,找不到再去数据库中查询,然后把结果写到缓存中。MyBatis的内部缓存使用一个HashMap,key为hashcode+statementId+sql语句。value为查询出来的结果映射成的Java对象。

二级缓存原理

二级缓存是mapper级别的。MyBatis默认是不开启二级缓存的。

第一次调用mapper下的SQL去查询用户信息。查询到的信息会存到该mapper对应的二级缓存区域内;第二次调用相同namespace下的mapper映射文件中相同的SQL去查询用户信息,MyBatis会自动去对应的二级缓存中取结果。如果相同namespace下的mapper映射文件中执行了增、删、改的SQL,并且执行了commi操作,此时会清空该namespace下的二级缓存。

如何开启二级缓存

配置SqlConfig.xml,开启二级缓存总开关

<!-- 全局配置参数 -->
<settings><!-- 开启二级缓存 --><setting name="cacheEnabled" value="true"/>
</settings>

在mapper.xml中开启二级缓存

<!-- 开启该mapper的namespace下的二级缓存 -->
<cache/>

cache标签的参数说明:

flushInterval 刷新间隔,可以被设置为任意正整数,单位为毫秒。默认情况是不设置的,也就是没有刷新间隔,缓存仅仅调用增、删、改语句时刷新 size 引用数目,可以被设置成任意正整数,缓存的内存容量,默认是1024 readOnly 只读,可以被设置为true或false,默认是false。只读的缓存会给所有调用者返回缓存对象的相同实例,这提供了很重要的性能优势。可读写的缓存会返回缓存对象的拷贝对象(通过序列化),这会慢一些,但是安全。

例如:

让POJO对象实现序列化接口

package org.mybatis.demo.po;import java.io.Serializable;
import java.util.Date;public class User implements Serializable {private static final long serialVersionUID = 1L;// 属性名和数据库表的字段对应private int id;private String username;// 用户姓名private String sex;// 性别private Date birthday;// 生日private String address;// 地址public int getId() {return id;}public void setId(int id) {this.id = id;}public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public String getSex() {return sex;}public void setSex(String sex) {this.sex = sex;}public Date getBirthday() {return birthday;}public void setBirthday(Date birthday) {this.birthday = birthday;}public String getAddress() {return address;}public void setAddress(String address) {this.address = address;}@Overridepublic String toString() {return "User [id=" + id + ", username=" + username + ", sex=" + sex+ ", birthday=" + birthday + ", address=" + address + "]";}
}

注意:如果该类存在父类,那么父类也要实现序列化

禁用二级缓存

在statement中的select标签设置userCache属性值为false可以禁用当前select语句的二级缓存,即每次查询都是去数据库中查询,默认值是true

<select id="findUserById" parameterType="java.lang.Integer" resultType="org.mybatis.demo.po.User" useCache="false">select * from user where id = #{id}
</select>

刷新二级缓存

在statement中的select标签设置flushCache属性值为false可以设置不执行缓存刷新,即每次执行增、删、改操作时,缓存不清空

<select id="findUsers" resultType="org.mybatis.demo.po.User" flushCache="false">select * from user
</select>

注意:如果不执行刷新缓存,会出现脏读。

MyBatis缓存技术(一级缓存、二级缓存)相关推荐

  1. 【mybatis】Mybatis中的一级、二级缓存

    [mybatis]简介 [mybatis]mybatis & mybatis-plus & hibernate的区别 [mybatis]核心成员分析 [mybatis]Mybatis的 ...

  2. Mybatis3.4.x技术内幕(二十二):Mybatis一级、二级缓存原理分析

    2019独角兽企业重金招聘Python工程师标准>>> Mybatis的一级缓存,指的是SqlSession级别的缓存,默认开启:Mybatis的二级缓存,指的是SqlSession ...

  3. 深入浅出 MyBatis 的一级、二级缓存机制

    一.MyBatis 缓存 缓存就是内存中的数据,常常来自对数据库查询结果的保存.使用缓存,我们可以避免频繁与数据库进行交互,从而提高响应速度. MyBatis 也提供了对缓存的支持,分为一级缓存和二级 ...

  4. mybatis和hibernate的一级、二级缓存

    MyBatis一级缓存: hibernate一级缓存: 基本差不多 HashMap本地缓存,作用域为session,session级别的缓存,通过get,update可以将对象放到一级缓存中,当 Se ...

  5. mybatis一级,二级缓存。缓存带来的脏读问题

    title 1. 关于缓存的介绍 2. 一级缓存,默认开启,session级别 3. 二级缓存,mapper 的namespace级别 1. 关于缓存的介绍 Mybatis一级缓存的作用域是同一个Sq ...

  6. Mybatis开启一级、二级缓存

    1.缓存 (1)概念:在内存中开辟的一个区域,用于存放数据,在内存中存放的数据叫做缓存. (2)好处:内存读取速度远快于硬盘,合理利用缓存,可以极大的提高查询的效率. 1.1 一级缓存 一级缓存的作用 ...

  7. NHibernate初学者指南(10):一级和二级缓存

    一级缓存 为了获得更好的性能,NHibernate智能地缓存数据.NHibernate有不同的缓存机制起作用,最重要的就是一级缓存.每个session对象维持一个一级缓存,session对象创建时缓存 ...

  8. Hibernate学习——(十二)Hibernate缓存机制(一级、二级、查询)

    一.why(为什么要用Hibernate缓存?) Hibernate是一个持久层框架,经常访问物理数据库. 为了降低应用程序对物理数据源访问的频次,从而提高应用程序的运行性能. 缓存内的数据是对物理数 ...

  9. mybatis延迟加载、缓存(一级、二级)

    一.mybatis的延迟加载 问题:在一对多中,当一个用户有100个账户. 1.在查询用户的时候,要不要把关联的账户查出来? 答:在查询用户时,用户下的账户信息应该是:什么时候使用,什么时候查询 2. ...

  10. mysql二级缓存,mybatis的动态sql和二级缓存

    mybatis的#{}和${}的区别就像是 PreparedStatement 和statement , 使用${}接收的参数还需用@Param注解修饰 , 推荐用#{} 动态SQL MyBatis ...

最新文章

  1. 在FFT分析在而立之年的展望与总结
  2. Word 2007 自动更新,让操作速度加倍!
  3. 当代计算机技术在建筑设备中的应用,智能化建筑中计算机技术应用研究原稿(样例3)...
  4. Category简介 (上篇)
  5. java和ssm是什么关系,JAVA --- SSH和SSM的区别
  6. memcache的深度解析(转)
  7. python学习笔记(十五)标准库StringIO和BytesIO
  8. require 动态加载_require,exports,module.exports和import,export,export default
  9. Java 8的新增功能(第I部分-JavaFX)
  10. 【CodeForces - 920E】Connected Components? (dsu,补图连通块,STLset+map,bfs 或bitset)
  11. 【C语言期末实训】学生学籍管理系统
  12. Windows Azure 入门系列课程Windows Azure 入门系列课程
  13. XLSTransformer 导出
  14. postSQL安装和GIS数据导入
  15. Numpy下载并安装
  16. mac安静执行脚本_自动切换mac输入法-安静模式
  17. MATLAB绘制二元函数图像
  18. win 10系统语言栏不见了怎么办?
  19. github帐户和仓库的创建
  20. 青柚文案:水果店青柚推广文案,水果青柚广告文案

热门文章

  1. 如何使用python寻找K线中的黄昏之星
  2. 《五代史通俗演义》推荐——不良人粉丝的一点敬意.
  3. 传统特征点检测器的检测特征点和匹配流程
  4. 大脑52分区功能及位置_位置功能
  5. 【全排列代码】这可能是全网最详细的解析了
  6. UDS-协议数据单元介绍
  7. 简单搭建钓鱼Wifi信号获取用户手机号
  8. 内存爆满导致电脑卡顿
  9. 远程桌面控制公司内网电脑修改PPT
  10. [c#] 使用Font-Awesome图标字体库