看了他,妈妈再也不用担心我被问到Mybatis缓存了
Mybatis缓存
一、一级缓存
1. 概念
- sqlsession级别的缓存,即缓存的是SQL语句
- 同一个sqlsession中执行多次查询条件相同的SQL,mybatis会提供一级缓存进行优化
2. 开启和关闭
开启
- 默认开启
关闭
<setting name="localCacheScope" value="STATEMENT"/>
3. 使用
@Test
public void method() throws IOException {
// 1.读取核心配置文件
InputStream in = Resources.getResourceAsStream("mybatis-config.xml");
// 2.获取sqlSessionFactory
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(in);
// 3.获取sqlSession
SqlSession sqlSession = sqlSessionFactory.openSession();
// 4.获取mapper
StudentMapper mapper = sqlSession.getMapper(StudentMapper.class);
// 5.调用相应的方法
Student student = mapper.getStudentById(1);
System.out.println(student);
System.out.println("----------------------------");
// 同一个sqlsession中执行相同的SQL查询,会走一级缓存
Student student1 = mapper.getStudentById(1);
System.out.println(student1);
// 6.释放资源
sqlSession.close();
in.close();
}
4. 什么时候失效
- 通过同一个SqlSession执行更新操作时,这个更新操作不仅仅指代update操作,还指插入和删除操作;
- 事务提交时会删除一级缓存;
- 事务回滚时也会删除一级缓存
5. 使用建议
平时使用MyBatis时都是和Spring结合使用的,在整个Spring容器中一般只有一个SqlSession实现类(bean默认是单例的)。而Spring一般都是主动提交事务的,所以说一级缓存经常失效。
还有就是我们也很少在一个事务范围内执行同一个SQL两遍,上面的这些原因导致我们在开发过程中很少注意到MyBatis一级缓存的存在。
不怎么用并不是说不用,作为一个合格的开发者需要对这些心知肚明,要清楚的知道MyBatis一级缓存的工作流程。
二、二级缓存
1. 概念
- mapper级别的缓存
2. 开启
核心配置文件:mybtis-config.xml
<setting name="cacheEnabled" value="true"/>
mapper
@CacheNamespace(blocking = true)
3. 使用
/**
* 二级缓存:
* 1.同一个sqlsession中,相同的SQL查询,会走缓存
* 2.中途执行了更新,则下次的SQL查询不走缓存
* 3.前面的sqlsession关闭之后,后面的sqlsession如果执行的是相同的SQL,则会走缓存
*
* @throws IOException
*/
@Test
public void method2() throws IOException {
// 1.读取核心配置文件
InputStream in = Resources.getResourceAsStream("mybatis-config.xml");
// 2.获取sqlSessionFactory
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(in);
// 3.获取sqlSession
SqlSession sqlSession = sqlSessionFactory.openSession();
// 4.获取mapper
StudentMapper mapper = sqlSession.getMapper(StudentMapper.class);
// 5.调用相应的方法
Student student = mapper.getStudentById(1);
System.out.println(student);
System.out.println("----------------------------");
// 执行更新操作:查看下面的查询是否还会走缓存
// int num = mapper.updateById(1);
// System.out.println(" num = "+num);
//
// System.out.println("----------------------------");
sqlSession.close();
// 同一个sqlsession中执行相同的SQL查询,会走一级缓存
SqlSession sqlSession1 = sqlSessionFactory.openSession();
// 4.获取mapper
StudentMapper mapper1 = sqlSession1.getMapper(StudentMapper.class);
Student student1 = mapper1.getStudentById(1);
System.out.println(student1);
// 6.释放资源
sqlSession1.close();
// sqlSession.close();
in.close();
}
4. 什么时候失效
- 二级缓存是以namespace(Mapper)为单位的,不同namespace下的操作互不影响。
- insert,update,delete操作会清空所在namespace下的全部缓存。
- 多表操作一定不要使用二级缓存,因为多表操作进行更新操作,一定会产生脏数据。
5. 使用建议
MyBatis的二级缓存实用性不是很大。一个原因就是Spring环境下,一本只有一个SqlSession,不存在sqlSession之间共享缓存;还有就是
MyBatis的缓存都不能做到分布式,所以对于MyBatis的二级缓存以了解为主。
总结
1. 一级缓存
一级缓存的本质是Executor的一个类似Map的属性;
一级缓存默认开启,将flushCache设置成true或者将全局配置localCacheScope设置成Statement可以关闭一级缓存;
在一级缓存开启的情况下,查询操作会先查询一级缓存,再查询数据库;
增删改操作和事务提交回滚操作会导致一级缓存失效;
由于Spring中事务是自动提交的,因此Spring下的MyBatis一级缓存经常失效。(但是并不表示不生效,除非你手动关闭一级缓存)
不能实现分布式。
2. 二级缓存
namesapce级别的缓存(Mapper级别或者叫做表级别的缓存),设计的主要目的是实现sqlSession之间的缓存共享;
开启二级缓存后,查询的逻辑是二级缓存->一级缓存->数据库;
insert,update,delete操作会清空所在namespace下的全部缓存;
多表查询一定不要使用二级缓存,因为多表操作进行更新操作,可能会产生脏数据。
总体来说,MyBatis的缓存功能比较鸡肋。想要使用缓存的话还是建议使用spring-cache等框架。
看了他,妈妈再也不用担心我被问到Mybatis缓存了的更多相关文章
- 妈妈再也不用担心别人问我是否真正用过redis了
1. Memcache与Redis的区别 1.1. 存储方式不同 1.2. 数据支持类型 1.3. 使用底层模型不同 2. Redis支持的数据类型 3. Redis的回收策略 4. Redis小命令 ...
- 有了 tldr,妈妈再也不用担心我记不住命令了
引言 有一次我在培训时说「程序员要善于使用 Terminal 以提高开发效率」,一位程序员反驳道:「这是 21 世纪,我们为什么要用落后的命令行,而不是先进的 GUI?」 是的,在一些人眼里,这个黑黑 ...
- 妈妈再也不用担心我使用git了
妈妈再也不用担心我使用git了 Dec 29, 2014 git git由于其灵活,速度快,离线工作等特点而倍受青睐,下面一步步来总结下git的基本命令和常用操作. 安装msysgit 下载地址:ms ...
- python爬虫07 | 有了 BeautifulSoup ,妈妈再也不用担心我的正则表达式了
我们上次做了 你的第一个爬虫,爬取当当网 Top 500 本五星好评书籍 有些朋友觉得 利用正则表达式去提取信息 太特么麻烦了 有没有什么别的方式 更方便过滤我们想要的内容啊 emmmm 你还别说 还 ...
- 利用CH341A编程器刷新BIOS,恢复BIOS,妈妈再也不用担心BIOS刷坏了
前几天,修电脑主析就捣鼓刷BIOS,结果刷完黑屏开不了机,立刻意识到完了,BIOS刷错了.就从网上查资料,各种方法试了个遍,什么用处都没有.终于功夫不负有心人,找到了编码器,知道了怎么用.下面看看具体 ...
- 锋利的js之妈妈再也不用担心我找错钱了
用js实现收银功能. <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <hea ...
- 收藏 | 15 个你非了解不可的 Linux 特殊字符,妈妈再也不用担心我看不懂这些符号了!
不知道大家接触 Linux 系统有多久了,可曾了解过 Linux 中有哪些特殊的字符呢?其实啊,那些特殊字符都大有用处呢,今天的文章就给大家简单地科普一下 Linux 中你需要了解的 15 个特殊字符 ...
- 有了jsRender,妈妈再也不用担心我用jq拼接DOM拼接的一团糟了、页面整齐了、其他伙伴读代码也不那么费劲了
写在前面 说来也很巧, 下午再做一个页面,再普通不过的分页列表,我还是像往常一样,基于MVC环境下,我正常用PagedList.MVC AJAX做无刷新分页,这时候问题就来了,列表数据中有个轮播图用到 ...
- 【C#】妈妈再也不用担心自定义控件如何给特殊类型的属性添加默认值了,附自定义GroupBox一枚
------------------更新:201411190903------------------ 经过思考和实践,发现套路中的第1条是不必要的,就是完全可以不用定义一个名为Default+属性名 ...
- 妈妈再也不用担心我的移动端了:网易和淘宝的rem方案剖析
从博主学习前端一路过来的经历了解到,前端移动开发是大部分从PC端转战移动端的小伙伴都非常头疼的一个问题,这边博主就根据一篇自己看过的移动开发文章来剖析一下网易和淘宝的rem解决方案,希望能够帮助到一些 ...
随机推荐
- 利用JavaScript自定义事件完成组件间的数据通信
我们知道,在JavaScript中,原生DOM事件在开发中是很有用的(与用户交互的重要方式),但是操作原生DOM事件其实有两大缺点:性能低.依赖于浏览器(NodeJs.小程序等不可用).那么这个时候, ...
- Overleaf使用技巧
插入图片 %插入图片% \begin{figure} \centering %居中% \resizebox{0.8\hsize}{!}{\includegraphics[clip=true]{Imag ...
- delphi cxgrid保存正在编辑的行
procedure SaveGridViewEditing(AView: TcxGridDBTableView); overload; var vDst: TDataSet; begin // 应用未 ...
- CDN与云计算技术的结合:专业视角下的深度融合
本文分享自天翼云开发者社区<CDN与云计算技术的结合:专业视角下的深度融合>,作者:大利 随着信息技术的不断发展,内容分发网络(CDN)与云计算技术作为两种重要的互联网基础设施,其结合已成 ...
- HPC中常见的调度器介绍
本文分享自天翼云开发者社区<HPC中常见的调度器介绍> 作者:土豆炒肉丝 在高性能计算(HPC)环境中,调度器是负责管理和分配计算资源(如计算节点.处理器核心.内存等)给待执行任务的重要组 ...
- C#中使用正则将字符串中某字符不区分大小写并按全字匹配替换为空
具体代码如下所示: //将字符串中desc不区分大小写并按全字匹配替换为空 var strText = "CreatDeSce DeSc,UserName AsC"; string ...
- ssh免密登录,服务器互信。
1.ssh-keygen 产生本主机的公钥和私钥. ssh-keygen -t rsa 文件保存在 ~/.ssh/目录下,其中 id_rsa:本地服务器的私钥 id_rsa.pub:本地服务器的公钥 ...
- 基于DeepSeek R1 满血版大模型的个人知识库,回答都源自对你专属文件的深度学习。
这是一座专属你的知识宝库,它依托 DeepSeek R1 满血版大模型构建而成.在这里,每一次回答都源自对你专属文件的深度学习,精准匹配你的知识需求,为你输出最贴合文件内容的答案 . 使用 Cherr ...
- 史陶比尔Stabli机器人维修小细节
在工业自动化领域,史陶比尔机器人以其卓越的性能和可靠性而著称.然而,即使是尖端的设备,也难免会遇到Stabli机械手故障和问题.对于机器人维护和修理,每一个小细节都显得至关重要. 一.观察 首先,我们 ...
- TTRSS 迁移实战
背景 几年前在云服务器上搭建了一套 TTRss + RssHub 集群, 用于阅读文章. 具体可以参见这篇文章: 使用 K8S 部署 RSS 全套自托管解决方案 - RssHub + Tiny Tin ...