MyBatis缓存通俗易懂

1.1     mybatis缓存介绍

如下图,是mybatis一级缓存和二级缓存的区别图解:

 

Mybatis一级缓存的作用域是同一个SqlSession,在同一个sqlSession中两次执行相同的sql语句,第一次执行完毕会将数据库中查询的数据写到缓存(内存),第二次会从缓存中获取数据将不再从数据库查询,从而提高查询效率。当一个sqlSession结束后该sqlSession中的一级缓存也就不存在了。当遇到增删改时会清空缓存。Mybatis默认开启一级缓存。

Mybatis二级缓存是多个SqlSession共享的,其作用域是mapper的同一个namespace,不同的sqlSession两次执行相同namespace下的sql语句且向sql中传递参数也相同即最终执行相同的sql语句,第一次执行完毕会将数据库中查询的数据写到缓存(内存),第二次会从缓存中获取数据将不再从数据库查询,从而提高查询效率。当遇到增删改时会清空缓存。Mybatis默认没有开启二级缓存需要在setting全局参数中配置开启二级缓存。

 

 

1.2     一级缓存

1.2.1  原理

下图是根据id查询用户的一级缓存图解:

 

一级缓存区域是根据SqlSession为单位划分的。

每次查询会先从缓存区域找,如果找不到从数据库查询,查询到数据将数据写入缓存。

Mybatis内部存储缓存使用一个HashMap,key为hashCode+sqlId+Sql语句。value为从查询出来映射生成的java对象

sqlSession执行insert、update、delete等操作commit提交后会清空缓存区域。

 

1.2.2  测试1

//获取session
SqlSession session = sqlSessionFactory.openSession();//获限mapper接口实例
UserMapper userMapper = session.getMapper(UserMapper.class);//第一次查询
User user1 = userMapper.findUserById(1);System.out.println(user1);//第二次查询,由于是同一个session则不再向数据发出语句直接从缓存取出
User user2 = userMapper.findUserById(1);System.out.println(user2);//关闭session
session.close();

 

1.2.3  测试2

 

//获取session
SqlSession session = sqlSessionFactory.openSession();//获限mapper接口实例
UserMapper userMapper = session.getMapper(UserMapper.class);//第一次查询
User user1 = userMapper.findUserById(1);System.out.println(user1);//在同一个session执行更新
User user_update = new User();user_update.setId(1);user_update.setUsername("李奎");userMapper.updateUser(user_update);session.commit();//第二次查询,虽然是同一个session但是由于执行了更新操作session的缓存被清空,这里重新发出sql操作
User user2 = userMapper.findUserById(1);System.out.println(user2);

 

1.3     二级缓存

1.3.1  原理

下图是多个sqlSession请求UserMapper的二级缓存图解。

 

 

二级缓存区域是根据mapper的namespace划分的,相同namespace的mapper查询数据放在同一个区域,如果使用mapper代理方法每个mapper的namespace都不同,此时可以理解为二级缓存区域是根据mapper划分。

每次查询会先从缓存区域找,如果找不到从数据库查询,查询到数据将数据写入缓存。

Mybatis内部存储缓存使用一个HashMap,key为hashCode+sqlId+Sql语句。value为从查询出来映射生成的java对象

sqlSession执行insert、update、delete等操作commit提交后会清空缓存区域。

 

 

1.3.2  开启二级缓存:

在核心配置文件SqlMapConfig.xml中加入

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

 

 

描述

允许值

默认值

cacheEnabled

对在此配置文件下的所有cache 进行全局性开/关设置。

true false

true

 

 

要在你的Mapper映射文件中添加一行:  <cache /> ,表示此mapper开启二级缓存。

 

1.3.3  实现序列化

         二级缓存需要查询结果映射的pojo对象实现java.io.Serializable接口实现序列化和反序列化操作,注意如果存在父类、成员pojo都需要实现序列化接口。

         public class Orders implements Serializable

         public class User implements Serializable

         ....

 

1.3.4  测试

 

//获取session1
SqlSession session1 = sqlSessionFactory.openSession();UserMapper userMapper = session1.getMapper(UserMapper.class);//使用session1执行第一次查询
User user1 = userMapper.findUserById(1);System.out.println(user1);//关闭session1
session1.close();//获取session2
SqlSession session2 = sqlSessionFactory.openSession();UserMapper userMapper2 = session2.getMapper(UserMapper.class);//使用session2执行第二次查询,由于开启了二级缓存这里从缓存中获取数据不再向数据库发出sql
User user2 = userMapper2.findUserById(1);System.out.println(user2);//关闭session2
session2.close();

 

1.3.5  禁用二级缓存

在statement中设置useCache=false可以禁用当前select语句的二级缓存,即每次查询都会发出sql去查询,默认情况是true,即该sql使用二级缓存。

<select id="findOrderListResultMap" resultMap="ordersUserMap" useCache="false">

 

1.3.6  刷新缓存

在mapper的同一个namespace中,如果有其它insert、update、delete操作数据后需要刷新缓存,如果不执行刷新缓存会出现脏读。

 

 设置statement配置中的flushCache="true" 属性,默认情况下为true即刷新缓存,如果改成false则不会刷新。使用缓存时如果手动修改数据库表中的查询数据会出现脏读。

如下:

<insert id="insertUser" parameterType="cn.itcast.mybatis.po.User" flushCache="true">

转载于:https://www.cnblogs.com/xiaolovewei/p/9427016.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/279683.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python基础教程:Python pass语句详解

2019独角兽企业重金招聘Python工程师标准>>> Python pass 语句 Python pass是空语句&#xff0c;是为了保持程序结构的完整性。 pass 不做任何事情&#xff0c;一般用做占位语句。 Python 语言 pass 语句语法格式如下&#xff1a; 实例&#xff1a; 学习从来不是一个…

网络串流_串流NFL足球的最便宜方式(无需电缆)

网络串流Football season is almost upon us. That means one thing: expensive cable or satellite TV packages. Okay, it also means beer commercials and overpriced stadium tickets and quarterbacks trying to sell you car insurance. But in terms of immediate cost…

【高清】网络安全思维导图

本文转自 是阿杰啊 51CTO博客&#xff0c;原文链接:http://blog.51cto.com/jschinamobile/1969018

Pixel相机是怎么做到自动补抓最不错的自拍照

网络大厂 AI研究团队近日在最新的Pixel相机中&#xff0c;于无快门模式Photobooth新增亲吻侦测功能&#xff0c;当用户亲吻自己的爱人时&#xff0c;相机会自动捕捉这一瞬间。网络大厂过去是藉由Photobooth模式&#xff0c;让用户更简单地成功自拍&#xff0c;不管是一个人、情…

os x 启动引导_什么是OS X的启动板以及它如何工作?

os x 启动引导If you’re new to OS X, or even if you’re not and you’re simply used to pinning everything to the Dock, you might have wondered what Launchpad is, what it does, and how to use it. 如果您不熟悉OS X&#xff0c;或者即使您不熟悉OS X&#xff0c;而…

freeradius的proxy功能

要配置freeRADIUS的proxy功能&#xff0c;就需要熟悉它的两个配置文件&#xff1a;proxy.conf 和client.conf。 1. proxy.conf主要是用来配置被代理的radius server&#xff08;也叫home server&#xff09; 和 realm&#xff0c; 以及他们之间的映射关系&#xff0c;也就是req…

小程序 iphone和安卓_如何阻止iPhone和iPad应用程序要求评级

小程序 iphone和安卓Lots of iPhone and iPad apps ask for ratings, and they often don’t stop. Even if you do leave a review just to stop seeing the review requests, new apps you install will pester you for reviews, too. iOS 11 fixes this problem, limiting h…

一篇年薪60万的JVM性能调优文章

2019独角兽企业重金招聘Python工程师标准>>> JVM 调优概述 性能定义 吞吐量 - 指不考虑 GC 引起的停顿时间或内存消耗&#xff0c;垃圾收集器能支撑应用达到的最高性能指标。延迟 - 其度量标准是缩短由于垃圾啊收集引起的停顿时间或者完全消除因垃圾收集所引起的停顿…

手机主题随手机壳改变_无线充电可以与手机壳一起使用吗?

手机主题随手机壳改变With wireless charging making its way into the new iPhones, there are undoubtedly a lot of questions floating around about how this technology works in practical application. The biggest question I’ve heard so far is: will it work with…

android 文本后图标_如何在Android中更改文本,图标等的大小

android 文本后图标Let’s face it: no matter how good the screens are on our phones and tablets, the text can sometimes be too tiny if you have poor eyesight. The good news is that there are a variety of methods to help you alleviate squinting just to make …

Linux文本查看命令之uniq

uniq是专用的去重命令限制&#xff1a;必须相邻的两行内容相同才算是重复&#xff0c;如果内容相同&#xff0c;但是两行之间有其他内容就不算重复。使用uniq命令先排序&#xff0c;再去重。-d 的选项是用来仅显示重复行的-u 仅显示不重复的行-c 统计每一行出现的次数本文转自 …

BitMap位图与海量数据的理解与应用

1. Bit Map算法简介 来自于《编程珠玑》。所谓的Bit-map就是用一个bit位来标记某个元素对应的Value&#xff0c; 而Key即是该元素。由于采用了Bit为单位来存储数据&#xff0c;因此在存储空间方面&#xff0c;可以大大节省。 2、 Bit Map的基本思想 我们先来看一个具体的例子&a…

imdb文件_如何停止IMDB应用程序向您发送通知

imdb文件Recently, the IMDB app started sending out notifications for “Featured Trailers”. As near as I can guess, this is where the production company pays IMDB to push a link to the trailer to a load of people in an effort to promote it. If IMDB isn’t …

科普:BCH能够买什么?如何使用BCH买东西?

2019独角兽企业重金招聘Python工程师标准>>> 一提到BCH&#xff0c;你最想拿它做什么&#xff1f;可能对于投资者来说&#xff0c;它是暴富的神器&#xff0c;是投资的工具&#xff1b;对于开发者来说&#xff0c;是实现自身价值构建应用程序的网络和平台&#xff0…

如何将iPhone或iPad更新到iOS 11

Apple released iOS 11 on September 19, 2017. You can upgrade by tapping “Install Now” when an update message appears, but you can also check for the update and install it immediately. 苹果于2017年9月19日发布了iOS11 。您可以通过在出现更新消息时点按“立即安…

如何在Outlook 2013中管理附件

There comes a time, job-hunting, or sharing photos with older family members, where you may need to send stuff the old fashioned way – as an email attachment. If you email at work, it may be a part of your email repertoire. 有时需要找工作&#xff0c;与年长…

ef 并发控制

ef 并发控制 ef 并发控制 什么是并发&#xff1f;并发分悲观并发和乐观并发。悲观并发&#xff1a;比如有两个用户A,B&#xff0c;同时登录系统修改一个文档&#xff0c;如果A先进入修改&#xff0c;则系统会把该文档锁住&#xff0c;B就没办法打开了&#xff0c;只有等A修改完…

如何在Windows上设置BitLocker加密

BitLocker is a tool built into Windows that lets you encrypt an entire hard drive for enhanced security. Here’s how to set it up. BitLocker是Windows内置的工具&#xff0c;可用于加密整个硬盘驱动器以增强安全性。 设置方法如下。 When TrueCrypt controversially …

Java字节码方法表与属性表深度剖析

方法表&#xff1a; 在上一次咱们已经分析到了字段信息了&#xff0c;如下&#xff1a; 紧接着就是方法相关的信息了&#xff1a; 而它展开之后的结构为&#xff1a; 所以往后数2个字节&#xff0c;看一下方法的总数&#xff1a; 3个方法&#xff0c;可咱们只定义了两个方法呀&…

最大连续子数组和与JUnit测试

【题目】最大连续子数组和&#xff08;最大子段和&#xff09; 背景 问题&#xff1a; 给定n个整数&#xff08;可能为负数&#xff09;组成的序列a[1],a[2],a[3],…,a[n],求该序列如a[i]a[i1]…a[j]的子段和的最大值。当所给的整数均为负数时定义子段和为0&#xff0c;依此定义…