`
changhongbao
  • 浏览: 123268 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

07、MyBatis学习总结(七)——Mybatis缓存

 
阅读更多

只为成功找方法,不为失败找借口!

MyBatis学习总结(七)——Mybatis缓存

一、MyBatis缓存介绍

  正如大多数持久层框架一样,MyBatis 同样提供了一级缓存二级缓存的支持

  1. 一级缓存: 基于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学习总结——MyBatis快速入门.docx

    在实际应用中,MyBatis还支持动态SQL、缓存、事务控制等高级特性,能够极大地提高开发效率和代码的可维护性。同时,MyBatis的注解功能允许你将XML配置文件中的SQL语句直接写在接口的方法上,使得代码更加简洁。总之...

    【MyBatis学习笔记八】——MyBatis缓存.zip

    本篇笔记将深入探讨MyBatis的缓存机制,包括一级缓存和二级缓存的概念、工作原理、配置与使用。 一级缓存是SqlSession级别的缓存,每当执行一个SQL查询时,如果结果不在缓存中,MyBatis会将其放入一级缓存。当同一...

    Mybatis入门实例(二)——添加ehcache缓存支持

    在本篇《Mybatis入门实例(二)——添加ehcache缓存支持》中,我们将深入探讨如何在Mybatis框架中集成Ehcache作为二级缓存,以提高数据访问的效率和性能。Ehcache是一个开源的Java分布式缓存,广泛用于缓存应用程序中...

    【MyBatis入门】—— 第一个MyBatis应用

    【MyBatis入门】—— 第一个MyBatis应用 MyBatis是一个优秀的持久层框架,它支持定制化SQL、存储过程以及高级映射。MyBatis避免了几乎所有的JDBC代码和手动设置参数以及获取结果集。MyBatis可以使用简单的XML或注解...

    缓存处理-mybatis层

    二级缓存的实现依赖于MyBatis的Cache接口,框架提供了一个默认的实现——HashMapCache。二级缓存允许配置在多个SqlSession之间共享数据,减少了数据库的访问次数。但是,由于多线程环境下可能存在并发问题,因此在...

    分布式系统架构——使用Redis做MyBatis的二级缓存 - CSDN博客1

    分布式系统架构中,使用Redis作为MyBatis的二级缓存是一种常见的优化策略,旨在提高数据访问性能并降低数据库负载。MyBatis是一个流行的Java持久层框架,它允许开发者编写SQL语句并将其与Java代码集成,提供了一种...

    mybatis学习的相关电子书pdf格式

    本压缩包包含的四个PDF电子书是关于MyBatis学习的宝贵资源,涵盖了从基础到高级的各种主题,对于想要深入理解和掌握MyBatis的开发者来说是非常实用的。 首先,我们来探讨MyBatis的核心概念。MyBatis的主要组件包括...

    Mybatis(dao)缓存|mybatis+redis(dao+service)缓存验证

    **验证2:Redis+Mybatis缓存——插入、查询** 1. **Dao设置**:在Mapper文件中配置二级缓存,并集成Redis。 2. **Service执行**:在服务层逻辑中集成Redis缓存。 3. **db结果**:记录使用Redis缓存前后的数据库查询...

    阿里巴巴P7架构师纯手工打造MyBatis源码——1小时解密底层源码.txt

    ### MyBatis源码解析——由阿里巴巴P7架构师纯手工打造 #### 一、前言 在现代软件开发过程中,持久层框架如MyBatis因其简单易用、灵活高效的特点而受到广泛欢迎。作为一款优秀的Java持久层框架,MyBatis通过SQL...

    mybatis-3.2.jar

    描述中的"mybatis-3.2 ibatis"提到了MyBatis的前称——iBATIS。iBATIS最初由Clinton Begin创建,是一个SQL映射框架,后来发展为MyBatis,由社区继续维护和发展。在MyBatis 3.2版本中,框架进行了许多改进和优化,...

    spring源码解析和mybatis学习

    本文将深入探讨这两个技术,并基于提供的资源——"Spring源码深度解析.pdf"和"MyBatis3用户指南中文版.pdf",对它们进行详细的知识点解析。 首先,让我们来了解Spring框架。Spring是一个开源的Java平台,它简化了...

    深入浅出MyBatis技术原理与实战

    MyBatis的缓存机制也是重要一环,书中会详细解析本地缓存和二级缓存的工作原理,以及如何配置和使用。此外,对于多数据源的支持,MyBatis同样提供了完善的解决方案,书中将指导读者如何在项目中实现多数据源切换。 ...

    MyBatis源码分析.pdf

    MyBatis源码分析 MyBatis是一款流行的Java持久层...本文对MyBatis的源码进行了深入分析,总结了MyBatis的核心组件和工作机理,本文将帮助读者更好地理解MyBatis的工作机理,并且能够更好地使用MyBatis进行数据库访问。

    我们一起读文档,学习MyBatis(一)----------- 一个简单demo的实现

    这篇博文"我们一起读文档,学习MyBatis(一)——一个简单demo的实现"旨在引导初学者理解并实践MyBatis的基本用法。 在开始之前,你需要了解MyBatis的核心概念: 1. **配置文件**:MyBatis的配置文件包含了数据源...

    Mybatis源码分析.pdf

    MyBatis是一款优秀的持久层框架,它的源码分析对于深入理解其工作原理...通过深入学习MyBatis的源码,开发者不仅可以掌握如何高效地使用MyBatis,还能提升对数据库操作和设计模式的理解,为实际项目开发带来诸多便利。

    mybatis第三方缓存需要的文件.zip

    在这个名为 "mybatis第三方缓存需要的文件.zip" 的压缩包中,包含的是 MyBatis 整合第三方缓存——EhCache 的相关组件和配置文件。 首先,我们要了解 EhCache 是一个开源的 Java 缓存库,它可以被用于存储和检索...

    深入浅出 mybatis技术原理与实践pdf

    总而言之,《深入浅出 MyBatis 技术原理与实践》是一本全面且深入的 MyBatis 学习指南,它不仅涵盖了框架的基础知识,还深入探讨了高级特性和最佳实践。无论是对 MyBatis 初学者还是有一定经验的开发者,这本书都将...

    SpringBoot+Mybatis整合完整源码

    学习和理解这一整合,不仅有助于提升开发效率,还能让你更好地理解和掌握 Spring Boot 的自动化配置机制以及 Mybatis 的动态 SQL 功能。在实际项目中,你可以根据需求进一步扩展,如集成 Swagger 进行 API 文档管理...

    mybatis基本例子的简单实现

    首先,我们要理解MyBatis的核心概念——映射文件(Mapper XML文件)。映射文件是MyBatis中的关键元素,它定义了SQL语句和Java对象之间的映射关系。在“mybatis映射笔记.odt”文档中,可能包含了如何创建和配置映射...

    Java Persistence with MyBatis 3

    在实际项目中,结合MyBatis的实践案例——mybatis-demo,读者可以更好地理解这些理论知识。mybatis-demo可能包含一个简单的项目结构,展示了如何创建MyBatis的环境,配置数据库连接,编写Mapper接口和映射文件,以及...

Global site tag (gtag.js) - Google Analytics