MyBatis学习笔记:缓存配置
使用缓存可以使应用更快地获取数据,避免频繁的数据库交互。MyBatis 作为持久化框架,提供了非常强大的查询缓存特性。
一般提交 MyBatis 缓存的时候,都是指二级缓存。一级缓存(也叫本地缓存)默认会启用,并且不能控制,因此很少会提到。
MyBatis 的一级缓存存在于 SqlSession 的生命周期中,在同一个 SqlSession 中查询时,MyBatis 会把执行的方法和参数通过算法生成缓存的键值,将键值和查询结果存入一个 Map 对象中。如果同一个 SqlSession 中执行的方法和参数完全一致,那么通过算法会生成相同的键值,当 Map 缓存对象中已经存在该键值时,则会返回缓存中的对象。
如果在方法上添加了 flushCache="true" ,那么就会在查询数据前清空当前的一级缓存。需要注意的是,任何和 insert update delete 操作都会清空一级缓存,再次查询时就会执行数据库查询。
二级缓存可以理解为存在于 SqlSessionFactory 的生命周期中。二级缓存是在 MyBatis 的全局配置 setting 中有一个参数 cacheEnabled,可以在 mybatis-config.xml 中添加如下代码:
<settings> <setting name="cacheEnabled" value="true"/> </settings>
MyBatis 的二级缓存是和命名空间绑定的,即二级缓存需要配置在 Mapper.xml 映射文件中,或者配置在 Mapper.java 接口中。在映射文件中,命名空间就是 xml 根节点 mapper 的 namespace 属性。在 Mapper 接口中,命名空间就是接口的全限定名称。
<mapper namespace="com.start.mybatis.mapper.SysUserMapper"> <cache/> </mapper>
其中 cache 有多个可以配置的属性,可查阅文档。
举个例子说明二级缓存是怎么起作用的:
- 打开 SqlSession
- 查询 id 为 20 的 role1
- 查询 id 为 20 的 role2
- 关闭 SqlSession
- 重新打开 SqlSession
- 再次查询 role2
- 查询 id 为 20 的 role3
- 关闭 SqlSession
第 3 步中查询使用的是一级缓存,返回同一个实例。第 4 步关闭 SqlSession 时,SqlSession 才会保存查询数据到二级缓存中,在这之后二级缓存才有了缓存数据。第 6 步和第 7 步均是查的二级缓存,这两步查询的结果都是反序列化得到的结果,所以它们不是相同的实例。在这一部分中,这两个实例是读写安全的,其属性不会相互影响。
MyBatis 默认提供的缓存实现是基于 Map 实现的内存缓存,已经可以满足基本的应用。但是当需要缓存大量的数据时,不能仅仅通过提高内存来使用 MyBatis 的二级缓存,还可以选择一些类似 EhCache 的缓存框架或 Redis 缓存数据库等工具来保存 MyBatis 的二级缓存数据。
原文地址:https://www.cnblogs.com/colin220/p/11378201.html
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- Android给任何view添加全屏倾斜水印
- 分布式一致性协议 - Paxos
- 链表中穿针引线
- Android 帧动画的实例详解
- Android HandlerThread使用方法详解
- LeetCode 167,两数之和2
- 详解android 通过uri获取bitmap图片并压缩
- android线程消息机制之Handler详解
- 分布式一致性协议 - ZAB
- 删除链表的倒数第N个节点
- Open3d学习计划—高级篇 2(彩色点云配准)
- Android7.0上某些PopuWindow出现显示位置不正确问题的解决方法
- 有效的括号
- Android PopupWindow实现左侧弹窗效果
- LeetCode. 209. 长度最小的子数组