MyBatis学习总结(七)——Mybatis缓存
一、MyBatis缓存介绍
正如大多数持久层框架一样,MyBatis 同样提供了一级缓存和二级缓存的支持
- 一级缓存: 基于PerpetualCache 的 HashMap本地缓存,其存储作用域为 Session,当 Session flush 或 close 之后,该Session中的所有 Cache 就将清空。
2. 二级缓存与一级缓存其机制相同,默认也是采用 PerpetualCache,HashMap存储,不同在于其存储作用域为 Mapper(Namespace),并且可自定义存储源,如 Ehcache。
3. 对于缓存数据更新机制,当某一个作用域(一级缓存Session/二级缓存Namespaces)的进行了 C/U/D 操作后,默认该作用域下所有 select 中的缓存将被clear。
1.1、Mybatis一级缓存测试
1 package me.gacl.test; 2 3 import me.gacl.domain.User; 4 import me.gacl.util.MyBatisUtil; 5 import org.apache.ibatis.session.SqlSession; 6 import org.junit.Test; 7 8 /** 9 * @author gacl 10 * 测试一级缓存 11 */ 12 public class TestOneLevelCache { 13 14 /* 15 * 一级缓存: 也就Session级的缓存(默认开启) 16 */ 17 @Test 18 public void testCache1() { 19 SqlSession session = MyBatisUtil.getSqlSession(); 20 String statement = "me.gacl.mapping.userMapper.getUser"; 21 User user = session.selectOne(statement, 1); 22 System.out.println(user); 23 24 /* 25 * 一级缓存默认就会被使用 26 */ 27 user = session.selectOne(statement, 1); 28 System.out.println(user); 29 session.close(); 30 /* 31 1. 必须是同一个Session,如果session对象已经close()过了就不可能用了 32 */ 33 session = MyBatisUtil.getSqlSession(); 34 user = session.selectOne(statement, 1); 35 System.out.println(user); 36 37 /* 38 2. 查询条件是一样的 39 */ 40 user = session.selectOne(statement, 2); 41 System.out.println(user); 42 43 /* 44 3. 没有执行过session.clearCache()清理缓存 45 */ 46 //session.clearCache(); 47 user = session.selectOne(statement, 2); 48 System.out.println(user); 49 50 /* 51 4. 没有执行过增删改的操作(这些操作都会清理缓存) 52 */ 53 session.update("me.gacl.mapping.userMapper.updateUser", 54 new User(2, "user", 23)); 55 user = session.selectOne(statement, 2); 56 System.out.println(user); 57 58 } 59 }
1.2、Mybatis二级缓存测试
1、开启二级缓存,在userMapper.xml文件中添加如下配置
<mapper namespace="me.gacl.mapping.userMapper"> <!-- 开启二级缓存 --> <cache/>
2、测试二级缓存
1 package me.gacl.test; 2 3 import me.gacl.domain.User; 4 import me.gacl.util.MyBatisUtil; 5 import org.apache.ibatis.session.SqlSession; 6 import org.apache.ibatis.session.SqlSessionFactory; 7 import org.junit.Test; 8 9 /** 10 * @author gacl 11 * 测试二级缓存 12 */ 13 public class TestTwoLevelCache { 14 15 /* 16 * 测试二级缓存 17 * 使用两个不同的SqlSession对象去执行相同查询条件的查询,第二次查询时不会再发送SQL语句,而是直接从缓存中取出数据 18 */ 19 @Test 20 public void testCache2() { 21 String statement = "me.gacl.mapping.userMapper.getUser"; 22 SqlSessionFactory factory = MyBatisUtil.getSqlSessionFactory(); 23 //开启两个不同的SqlSession 24 SqlSession session1 = factory.openSession(); 25 SqlSession session2 = factory.openSession(); 26 //使用二级缓存时,User类必须实现一个Serializable接口===> User implements Serializable 27 User user = session1.selectOne(statement, 1); 28 session1.commit();//不懂为啥,这个地方一定要提交事务之后二级缓存才会起作用 29 System.out.println("user="+user); 30 31 //由于使用的是两个不同的SqlSession对象,所以即使查询条件相同,一级缓存也不会开启使用 32 user = session2.selectOne(statement, 1); 33 //session2.commit(); 34 System.out.println("user2="+user); 35 } 36 }
1.3、二级缓存补充说明
1. 映射语句文件中的所有select语句将会被缓存。
2. 映射语句文件中的所有insert,update和delete语句会刷新缓存。
3. 缓存会使用Least Recently Used(LRU,最近最少使用的)算法来收回。
4. 缓存会根据指定的时间间隔来刷新。
5. 缓存会存储1024个对象
cache标签常用属性:
<cache eviction="FIFO" <!--回收策略为先进先出--> flushInterval="60000" <!--自动刷新时间60s--> size="512" <!--最多缓存512个引用对象--> readOnly="true"/> <!--只读-->
相关推荐
在实际应用中,MyBatis还支持动态SQL、缓存、事务控制等高级特性,能够极大地提高开发效率和代码的可维护性。同时,MyBatis的注解功能允许你将XML配置文件中的SQL语句直接写在接口的方法上,使得代码更加简洁。总之...
本篇笔记将深入探讨MyBatis的缓存机制,包括一级缓存和二级缓存的概念、工作原理、配置与使用。 一级缓存是SqlSession级别的缓存,每当执行一个SQL查询时,如果结果不在缓存中,MyBatis会将其放入一级缓存。当同一...
在本篇《Mybatis入门实例(二)——添加ehcache缓存支持》中,我们将深入探讨如何在Mybatis框架中集成Ehcache作为二级缓存,以提高数据访问的效率和性能。Ehcache是一个开源的Java分布式缓存,广泛用于缓存应用程序中...
【MyBatis入门】—— 第一个MyBatis应用 MyBatis是一个优秀的持久层框架,它支持定制化SQL、存储过程以及高级映射。MyBatis避免了几乎所有的JDBC代码和手动设置参数以及获取结果集。MyBatis可以使用简单的XML或注解...
二级缓存的实现依赖于MyBatis的Cache接口,框架提供了一个默认的实现——HashMapCache。二级缓存允许配置在多个SqlSession之间共享数据,减少了数据库的访问次数。但是,由于多线程环境下可能存在并发问题,因此在...
分布式系统架构中,使用Redis作为MyBatis的二级缓存是一种常见的优化策略,旨在提高数据访问性能并降低数据库负载。MyBatis是一个流行的Java持久层框架,它允许开发者编写SQL语句并将其与Java代码集成,提供了一种...
本压缩包包含的四个PDF电子书是关于MyBatis学习的宝贵资源,涵盖了从基础到高级的各种主题,对于想要深入理解和掌握MyBatis的开发者来说是非常实用的。 首先,我们来探讨MyBatis的核心概念。MyBatis的主要组件包括...
**验证2:Redis+Mybatis缓存——插入、查询** 1. **Dao设置**:在Mapper文件中配置二级缓存,并集成Redis。 2. **Service执行**:在服务层逻辑中集成Redis缓存。 3. **db结果**:记录使用Redis缓存前后的数据库查询...
### MyBatis源码解析——由阿里巴巴P7架构师纯手工打造 #### 一、前言 在现代软件开发过程中,持久层框架如MyBatis因其简单易用、灵活高效的特点而受到广泛欢迎。作为一款优秀的Java持久层框架,MyBatis通过SQL...
描述中的"mybatis-3.2 ibatis"提到了MyBatis的前称——iBATIS。iBATIS最初由Clinton Begin创建,是一个SQL映射框架,后来发展为MyBatis,由社区继续维护和发展。在MyBatis 3.2版本中,框架进行了许多改进和优化,...
MyBatis源码分析 MyBatis是一款流行的Java持久层...本文对MyBatis的源码进行了深入分析,总结了MyBatis的核心组件和工作机理,本文将帮助读者更好地理解MyBatis的工作机理,并且能够更好地使用MyBatis进行数据库访问。
本文将深入探讨这两个技术,并基于提供的资源——"Spring源码深度解析.pdf"和"MyBatis3用户指南中文版.pdf",对它们进行详细的知识点解析。 首先,让我们来了解Spring框架。Spring是一个开源的Java平台,它简化了...
MyBatis的缓存机制也是重要一环,书中会详细解析本地缓存和二级缓存的工作原理,以及如何配置和使用。此外,对于多数据源的支持,MyBatis同样提供了完善的解决方案,书中将指导读者如何在项目中实现多数据源切换。 ...
这篇博文"我们一起读文档,学习MyBatis(一)——一个简单demo的实现"旨在引导初学者理解并实践MyBatis的基本用法。 在开始之前,你需要了解MyBatis的核心概念: 1. **配置文件**:MyBatis的配置文件包含了数据源...
MyBatis是一款优秀的持久层框架,它的源码分析对于深入理解其工作原理...通过深入学习MyBatis的源码,开发者不仅可以掌握如何高效地使用MyBatis,还能提升对数据库操作和设计模式的理解,为实际项目开发带来诸多便利。
在这个名为 "mybatis第三方缓存需要的文件.zip" 的压缩包中,包含的是 MyBatis 整合第三方缓存——EhCache 的相关组件和配置文件。 首先,我们要了解 EhCache 是一个开源的 Java 缓存库,它可以被用于存储和检索...
总而言之,《深入浅出 MyBatis 技术原理与实践》是一本全面且深入的 MyBatis 学习指南,它不仅涵盖了框架的基础知识,还深入探讨了高级特性和最佳实践。无论是对 MyBatis 初学者还是有一定经验的开发者,这本书都将...
学习和理解这一整合,不仅有助于提升开发效率,还能让你更好地理解和掌握 Spring Boot 的自动化配置机制以及 Mybatis 的动态 SQL 功能。在实际项目中,你可以根据需求进一步扩展,如集成 Swagger 进行 API 文档管理...
首先,我们要理解MyBatis的核心概念——映射文件(Mapper XML文件)。映射文件是MyBatis中的关键元素,它定义了SQL语句和Java对象之间的映射关系。在“mybatis映射笔记.odt”文档中,可能包含了如何创建和配置映射...
在实际项目中,结合MyBatis的实践案例——mybatis-demo,读者可以更好地理解这些理论知识。mybatis-demo可能包含一个简单的项目结构,展示了如何创建MyBatis的环境,配置数据库连接,编写Mapper接口和映射文件,以及...