MyBatis缓存技术(一级缓存、二级缓存)
来源:互联网 发布:网络协议' 编辑:程序博客网 时间:2024/05/01 12:22
1、MyBatis的缓存分类
一级缓存
一级缓存的作用域是一个SqlSession。MyBatis默认开启一级缓存。在同一个SqlSession中,执行相同的查询SQL,第一次会查询数据库,并写到缓存中;第二次直接从缓存中读取。当执行SQL时,两次查询中间发生了增、删、改的操作,则SqlSession的缓存会被清空。
二级缓存
二级缓存的作用域是一个namesp下的mapper映射文件内容,可以多个SqlSession共享。MyBatis需要手动设置启动二级缓存(在SQLConfig中配置setting标签)。在同一个namespace下的mapper文件中,执行相同的SQL,第一次会去查询数据库,并写到缓存中;第二次直接从缓存中取。当执行SQL时,两次查询中间发生了增、删、改的操作,则二级缓存清空。
2、MyBatis缓存原理
2.1、一级缓存
一级缓存是根据SqlSession为单位划分的。每次查询会先去缓存中找,找不到再去数据库中查询,然后把结果写到缓存中。MyBatis的内部缓存使用一个HashMap,key为hashcode+statementId+sql语句。value为查询出来的结果映射成的Java对象。
2.2、二级缓存原理
二级缓存是mapper级别的。MyBatis默认是不开启二级缓存的。
第一次调用mapper下的SQL去查询用户信息。查询到的信息会存到该mapper对应的二级缓存区域内;第二次调用相同namespace下的mapper映射文件中相同的SQL去查询用户信息,MyBatis会自动去对应的二级缓存中取结果。如果相同namespace下的mapper映射文件中执行了增、删、改的SQL,并且执行了commi操作,此时会清空该namespace下的二级缓存。
3、如何开启二级缓存
3.1、配置SqlConfig.xml,开启二级缓存总开关
<!-- 全局配置参数 --><settings><!-- 开启二级缓存 --><setting name="cacheEnabled" value="true"/></settings>3.2、在mapper.xml中开启二级缓存
<!-- 开启该mapper的namespace下的二级缓存 --><cache/>cache标签的参数说明:flushInterval 刷新间隔,可以被设置为任意正整数,单位为毫秒。默认情况是不设置的,也就是没有刷新间隔,缓存仅仅调用增、删、改语句时刷新size引用数目,可以被设置成任意正整数,缓存的内存容量,默认是1024readOnly只读,可以被设置为true或false,默认是false。只读的缓存会给所有调用者返回缓存对象的相同实例,这提供了很重要的性能优势。可读写的缓存会返回缓存对象的拷贝对象(通过序列化),这会慢一些,但是安全。
例如:
<cache flushInterval="60000" size="512" readOnly="true"/>3.3、让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 + "]";}}注意:如果该类存在父类,那么父类也要实现序列化
4、禁用二级缓存
在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>5、刷新二级缓存
在statement中的select标签设置flushCache属性值为false可以设置不执行缓存刷新,即每次执行增、删、改操作时,缓存不清空
<select id="findUsers" resultType="org.mybatis.demo.po.User" flushCache="false">select * from user</select>注意:如果不执行刷新缓存,会出现脏读。
6、源代码
MyBatis缓存(一级缓存、二级缓存)
- MyBatis缓存技术(一级缓存、二级缓存)
- MyBatis之缓存(一级缓存、二级缓存)
- MyBatis一级缓存,二级缓存
- MyBatis 一级缓存,二级缓存
- mybatis一级缓存二级缓存
- 【Mybatis】(五)一级缓存和二级缓存
- mybatis--缓存(一级和二级缓存)
- mybatis 详解(九)------ 一级缓存、二级缓存
- mybatis 详解(九)------ 一级缓存、二级缓存
- mybatis 详解(九)------ 一级缓存、二级缓存
- Mybatis Cache(一级缓存、二级缓存)
- mybatis:一级缓存And二级缓存
- mybatis一级缓存和二级缓存
- MyBatis(4)一级缓存,二级缓存
- Mybatis 一级缓存和二级缓存
- MyBatis一级缓存和二级缓存
- mybatis 一级缓存和二级缓存
- Mybatis一级缓存和二级缓存
- C++封装线程类
- 使用SurfaceView和MediaPlayer播放视频
- tensorflow加载部分层方法
- DrawCall(DC)优化
- leetcode谷歌面试题279. Perfect Squares
- MyBatis缓存技术(一级缓存、二级缓存)
- PHP单元测试利器:PHPUNIT深入用法(二)
- PHP 开发者应了解的24个库
- C语言中typedef用法
- 网络协议栈设计(三)---链路层以太网分析(发送)
- JAVA求学之路第十五天
- jquery异步提交表单
- 《数学之美(第二版)》
- If no other git process is currently running, this probably means a git process crashed in this rep