MyBatis 有 一级缓存 和 二级缓存。
一级缓存
一级缓存,默认就是开启的,范围是 Session。
可通过 localCacheScope 设置不同的范围,支持两种范围:
-
SESSION:同一个 SQL Session 内的查询共享数据。(默认配置)
(类似事务隔离级别中的 “Repeatable Read”) -
STATEMENT:缓存仅用于语句执行;同一个 SQL Session 内的不同调用不会共享数据。
(类似 “Read Committed”)
注意:MyBatis中的Session与Spring中的事务绑定。
Spring默认每次都创建一个新的SqlSession,所以一级缓存无效。
如果在同一个事务中执行sql,则使用同一个SqlSession,一级缓存生效。
可将日志级别设置为 Debug,查看 SqlSession 信息。
二级缓存(Mapper)
二级缓存 是 Mapper 级别的缓存,默认是关闭的。
可通过在Mapper文件中添加 <cache/> 开启。最好有完善的测试数据支撑开启二级缓存的决定(包括调整参数)。
- Mapper 文件中,所有 Select 语句会被缓存
- Mapper 文件中,所有 Insert、Update、Delete 语句会刷新缓存
- 默认使用 LRU(Least Recently Used)算法回收缓存空间
这是最通用的算法。FIFO(先将先出)和 基于GC的SOFT(软引用)、WEAK(弱引用)的适用场景较少。 - 默认没有定时刷新,只在执行语句时刷新
- 默认缓存1024个列表或对象(引用)
- 默认缓存既可读又可写
只读的缓存性能更好,但可写的模式更安全。
自定义缓存实现
通过实现 org.apache.ibatis.cache.Cache 接口,并在 <cache/> 中指定类型就能使用自定义的缓存。
<cache type="com.domain.something.MyCustomCache"/>
public interface Cache { String getId(); void putObject(); Object getObject(); Object removeObject(); void clear(); int getSize(); ReadWriteLock getReadWriteLock(); }
不用缓存
禁用二级缓存
1. 对于二级缓存,如果不想用,可以不配置,因为默认就是关闭的。
2. 如果只想在部分语句中禁用,则可以将 useCache 设置为 false,防止执行结果被存入二级缓存。
另,如果 flushCache = true,则句执行后,对应的 一级缓存 和 二级缓存 都会被刷新。
不同SQL的默认 flushCache 和 useCache 设置:
<select ... flushCache="false" useCache="true" /> <insert ... flushCache="true" /> <update ... flushCache="true" /> <delete ... flushCache="true" />
禁用一级缓存
1. 上述将 flushCache 设置为false 的方法也可以达到禁用一级缓存的效果。
2. 将一级缓存的范围改为 Statement 也可以满足部分场景需求。
3. 也可以在更上层的业务代码中避开缓存。MyBatis的Session是与Spring中的事务绑定的。如果将事务传播行为设置为 REQUIRES_NEW,则相关业务方法就进入了新的Session,不会去使用原Session中的缓存数据。
@Transactional(propagation=Propagation.REQUIRES_NEW)
相关推荐
Mybatis缓存机制是数据库操作中的重要组成部分,它能够提高数据访问效率,减少对数据库的重复查询。在Mybatis中,缓存分为一级缓存和二级缓存,这两种缓存各有其特点和应用场景。 一级缓存是SqlSession级别的缓存,...
缓存是MyBatis性能优化的重要手段,分为一级缓存和二级缓存。在这篇文章中,我们将深入探讨这两个级别的缓存机制及其工作原理。 **一级缓存** 一级缓存是SqlSession级别的缓存,也称为局部缓存。当你执行一个查询...
mybatis支持缓存,如果我们查找数据库中某一条记录时,先从缓存中获取,如果缓存中不存在该记录,则从数据库中获取,在放入到缓存中。该文档是关于mybatis使用一级或二级缓存的介绍
在这个“Mybatis缓存测试示例”中,我们将深入探讨Mybatis的缓存机制,以及如何在实际项目中进行测试。 Mybatis 的缓存分为一级缓存和二级缓存。一级缓存是SqlSession级别的,同一SqlSession内的多次相同查询会复用...
本教程“Mybatis系列教程Mybatis缓存共17页”旨在深入解析Mybatis的缓存功能。 在Mybatis中,缓存分为一级缓存和二级缓存。一级缓存是SqlSession级别的,同一个SqlSession内的多次相同查询会复用第一次查询的结果,...
在这篇文档《Mybatis缓存开源架构源码2021》中,很可能会深入探讨这两级缓存的工作原理和实现。 首先,一级缓存是 SqlSession 级别的,基于 HashMap 实现。当我们在一个 SqlSession 中执行了查询操作,结果会被缓存...
#### 一、MyBatis缓存机制概述 在MyBatis中,缓存是一项重要的性能优化措施。它能够显著减少数据库的访问次数,提高应用程序的响应速度。MyBatis提供了两种级别的缓存支持:一级缓存和二级缓存。 - **一级缓存**:...
标题 "mybatis 缓存的简单配置" 涉及的是MyBatis框架中的缓存机制,这是一个关键特性,用于提升数据库操作的效率。MyBatis的缓存分为一级缓存和二级缓存,它们各自有不同的作用和实现方式。 一级缓存是SqlSession...
通过对MyBatis缓存机制的深入理解,开发者可以更有效地利用缓存提升应用性能,同时避免并发控制和数据一致性的问题。通过自定义缓存策略,还可以根据项目需求调整缓存的行为,比如使用更复杂的排除算法或调整缓存...
Mybatis 缓存原理及失效情况解析 Mybatis 缓存是指将经常查询的数据存于内存中,以提高查询效率,解决高并发系统的性能问题。Mybatis 缓存分为一级缓存和二级缓存两种。 一级缓存,也称为本地缓存,指的是...
本篇笔记将深入探讨MyBatis的缓存机制,包括一级缓存和二级缓存的概念、工作原理、配置与使用。 一级缓存是SqlSession级别的缓存,每当执行一个SQL查询时,如果结果不在缓存中,MyBatis会将其放入一级缓存。当同一...
在处理大量数据时,为了提高性能,MyBatis引入了缓存机制。缓存可以分为一级缓存和二级缓存,它们在不同的范围内存储和复用已查询过的数据,避免重复的数据库访问。 一级缓存是SqlSession级别的,它是默认开启的。...
MyBatis缓存功能原理及实例解析 MyBatis缓存功能原理及实例解析是MyBatis框架中非常重要的一部分,它可以极大的提升查询效率,解决高并发系统的性能问题。缓存机制可以将用户经常查询的数据放在缓存(内存)中,...
本篇文章将详细探讨MyBatis的缓存机制,包括一级缓存和二级缓存,以及如何将MyBatis与第三方缓存EhCache进行整合。 首先,我们来了解一级缓存。一级缓存是SqlSession级别的,也称为本地缓存。当我们在一个...
个人学习mybatis源码总结
2. 分布式环境下的缓存:在分布式系统中,二级缓存可能导致数据冲突,这时可以考虑使用分布式缓存解决方案,如Redis或Memcached,配合MyBatis的插件实现分布式缓存。 3. 缓存穿透和缓存雪崩:缓存穿透是指查询的...
MyBatis提供了两种级别的缓存:一级缓存(本地缓存)和二级缓存(全局缓存)。 一级缓存是SqlSession级别的,它默认始终开启。当在一个SqlSession中执行SQL查询时,查询结果会被存储在本地缓存中。如果后续请求相同...
#### 一、Mybatis缓存机制概述 Mybatis提供了一级缓存和二级缓存两种缓存机制,这两种缓存机制有助于提高数据访问的效率。 **1.1 一级缓存** 一级缓存是在同一个`SqlSession`生命周期内的缓存机制,它基于Per ...
标题中的“mybatis二级缓存”指的是MyBatis框架中的一个重要特性,它是MyBatis缓存机制的一部分,用于提升数据库查询效率。MyBatis一级缓存是SqlSession级别的,而二级缓存则是在整个Mapper配置范围内的全局缓存,...