不能吧,你不能这样,都最后了-------sql和缓存(“最易懂得MyBatis学习”)(下)

简介: 十三、缓存1. 简介2. Mybatis缓存3. 一级缓存3.1 测试步骤:3.2 缓存失效得情况3.3 小结4. 二级缓存4.1 简介4.2 开启步骤4.3 测试4.4 小结5. 缓存原理6. 自定义缓存-Ehcache

十三、缓存

1. 简介


查询-->需要连接数据库,耗资源
  一次查询的结果,给他暂存一个可以直接取到的地方-->内存:缓存
我们再次查询相同数据的时候,直接走缓存,就不用走数据库了 

1.什么是缓存[Cache]?


  • 存在内存中的临时数据


  • 将用户经常查询的数据放在缓存(内存)中,用户去查询数据就不用从磁盘上(关系型数据库数据文件)查询,从缓存中查询,从而提高查询效率,解决了高并发系统的性能问题。


2.为什么要使用缓存?


  • 减少和数据库的交互次数,减少系统开销,提高系统效率


3.什么样的数据能使用缓存?


  • 经常查询并且不经常改变的数据


2. Mybatis缓存


1.Mybatis包含一个非常强大的查询缓存特性,它可以非常方便地定制和配置缓存。缓存可以极大地提升查询效率。


2.Mybatis系统中默认定义了两级缓存:一级缓存和二级缓存


  • 默认情况下,只有一级缓存开启。(Sqlsession级别的缓存,也称为本地缓存)


  • 二级缓存需要手动开启和配置,是基于namespace级别的缓存


  • 为了提高扩展性,mybatis定义了缓存接口,我们可以通过实现Cache接口来自定义二级缓存。


3. 一级缓存


  • 一级缓存也叫本地缓存:SqlSession


  • 与数据库同一次会话期间查询到得数据会放在本地缓存中


  • 以后如果需要获取相同得数据,直接从换从中拿,没必要再去查询数据库


3.1 测试步骤:


1. 开启日志


在核心配置文件中

<settings>
    <!--标准的日志工厂实现-->
    <setting name="logImpl" value="STDOUT_LOGGING"/>
</settings>

2.测试再一个Session中查询两次相同得记录

@Test
public void queryUserByIdTest(){
    SqlSession sqlSession = MybatisUtils.getSqlSession();
    UserMapper mapper = sqlSession.getMapper(UserMapper.class);
    User user = mapper.queryUserById(1);
    System.out.println(user);
    System.out.println("========");
    User user1 = mapper.queryUserById(1);
    System.out.println(user1);
    sqlSession.close();
}

3.查看日志输出

微信图片_20211230140622.png


3.2 缓存失效得情况


  • 查询不同得东西


  • 增删改操作可能会改变原来得数据,所以必定会刷新缓存


  • 比如说在查两个相同的用户,中间插一个修改用户的操作


  • 查询不同Mapper.xml


  • 手动清理缓存


sqlSession.clearCache();//手动清理缓存

3.3 小结


一级缓存默认是开启的,只在一次sqlSession中有效,也就是拿到连接到关闭连接这个区间


一级缓存就相当于一个map


4. 二级缓存


4.1 简介


4.2 开启步骤


1.开启全局缓存


虽然默认就是true但是还是需要显示的开启一下,增强可读性


微信图片_20211230140907.png


在核心配置文件中

<settings>
    <!--显示的开启全局缓存-->
    <setting name="cacheEnabled" value="true"/>
</settings>


2.要启用二级缓存需要在sql映射文件中添加一行代码


<!--在当前Mapper.xml中开启二级缓存-->
<cache/>

也可以自定义一些参数


<!--官网上是这个。加上会有一些设定,比如先进先出,60秒,512个引用,只读为true-->
<cache eviction="FIFO" flushInterval="60000" size="512" readOnly="true"/>

还可以在你想要的地方关闭缓存,只需要在sql语句标签下添加下面的代码


微信图片_20211230141049.png

4.3 测试


1. 如果没有加二级缓存,查询两个sqlSession是会进入两次数据库的


@Test
public void queryUserByIdTest(){
    SqlSession sqlSession = MybatisUtils.getSqlSession();
    SqlSession sqlSession2 = MybatisUtils.getSqlSession();
    UserMapper mapper = sqlSession.getMapper(UserMapper.class);
    UserMapper mapper2 = sqlSession2.getMapper(UserMapper.class);
    User user = mapper.queryUserById(1);
    System.out.println(user);
    User user1 = mapper2.queryUserById(1);
    System.out.println(user1);
    sqlSession.close();
    sqlSession2.close();
}

微信图片_20211230141150.png

2.如果开启了二级缓存

@Test
public void queryUserByIdTest(){
    SqlSession sqlSession = MybatisUtils.getSqlSession();
    SqlSession sqlSession2 = MybatisUtils.getSqlSession();
    UserMapper mapper = sqlSession.getMapper(UserMapper.class);
    User user = mapper.queryUserById(1);
    System.out.println(user);
    sqlSession.close();
    UserMapper mapper2 = sqlSession2.getMapper(UserMapper.class);
    User user1 = mapper2.queryUserById(1);
    System.out.println(user1);
    System.out.println(user == user1);
    sqlSession2.close();
}

微信图片_20211230141530.png


3.问题:


我们需要将实体类序列化,否则就会报错

Caused by:java.io.NotSerializableException:com.hxl.pojo.User


我们需要在实体类后加上implements Serializable

@Data
public class User implements Serializable {
    private int id;
    private String name;
    private String pwd;
}


4.4 小结


  1. 只要开启了二级缓存,在同一个Mapper下就有效


  1. 所有的数据都会先放在一级缓存中


  1. 只有当会话提交,或者关闭的时候,才会提交到二级缓存中


  1. 实体类要序列化


5. 缓存原理

微信图片_20211230141657.png


6. 自定义缓存-Ehcache


Ehcache是一种广泛使用的开源Java分布式缓存,主要面向通用缓存


要在程序中使用Ehcache,先要导包

<dependency>
    <groupId>org.mybatis.caches</groupId>
    <artifactId>mybatis-ehcache</artifactId>
    <version>1.2.1</version>
</dependency>

在resources下建立一个ehcache.xml文件

<?xml version="1.0" encoding="UTF-8" ?>
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="http://ehcache.org/ehcache.xsd"
         updateCheck="false">
    <!--
    -->
    <diskStore path="./tmpdir/Tmp_EhCache"/>
    <defaultCache
            eternal="false"
            maxElementsInMemory="10000"
            overflowToDisk="false"
            diskPersistent="false"
            timeToIdleSeconds="1800"
            timeToLiveSeconds="259200"
            memoryStoreEvictionPolicy="LRU"/>
    <cache
            name="cloud_user"
            eternal="false"
            maxElementsInMemory="5000"
            overflowToDisk="false"
            diskPersistent="false"
            timeToIdleSeconds="1800"
            timeToLiveSeconds="1800"
            memoryStoreEvictionPolicy="LRU"/>
</ehcache>

在需要的Mapper.xml下

<cache type="org.mybatis.caches.ehcache.EhcacheCache"></cache>

测试微信图片_20211230141827.png

相关文章
|
2月前
|
缓存 Java 数据库连接
mybatis复习05,mybatis的缓存机制(一级缓存和二级缓存及第三方缓存)
文章介绍了MyBatis的缓存机制,包括一级缓存和二级缓存的配置和使用,以及如何整合第三方缓存EHCache。详细解释了一级缓存的生命周期、二级缓存的开启条件和配置属性,以及如何通过ehcache.xml配置文件和logback.xml日志配置文件来实现EHCache的整合。
mybatis复习05,mybatis的缓存机制(一级缓存和二级缓存及第三方缓存)
|
3天前
|
SQL 缓存 Java
【详细实用のMyBatis教程】获取参数值和结果的各种情况、自定义映射、动态SQL、多级缓存、逆向工程、分页插件
本文详细介绍了MyBatis的各种常见用法MyBatis多级缓存、逆向工程、分页插件 包括获取参数值和结果的各种情况、自定义映射resultMap、动态SQL
【详细实用のMyBatis教程】获取参数值和结果的各种情况、自定义映射、动态SQL、多级缓存、逆向工程、分页插件
|
4天前
|
SQL 缓存 Java
MyBatis如何关闭一级缓存(分注解和xml两种方式)
MyBatis如何关闭一级缓存(分注解和xml两种方式)
21 5
|
19天前
|
缓存 Java 数据库连接
使用MyBatis缓存的简单案例
MyBatis 是一种流行的持久层框架,支持自定义 SQL 执行、映射及复杂查询。本文介绍了如何在 Spring Boot 项目中集成 MyBatis 并实现一级和二级缓存,以提高查询性能,减少数据库访问。通过具体的电商系统案例,详细讲解了项目搭建、缓存配置、实体类创建、Mapper 编写、Service 层实现及缓存测试等步骤。
|
26天前
|
SQL Java 数据库连接
mybatis使用四:dao接口参数与mapper 接口中SQL的对应和对应方式的总结,MyBatis的parameterType传入参数类型
这篇文章是关于MyBatis中DAO接口参数与Mapper接口中SQL的对应关系,以及如何使用parameterType传入参数类型的详细总结。
30 10
|
25天前
|
SQL 缓存 Java
JVM知识体系学习三:class文件初始化过程、硬件层数据一致性(硬件层)、缓存行、指令乱序执行问题、如何保证不乱序(volatile等)
这篇文章详细介绍了JVM中类文件的初始化过程、硬件层面的数据一致性问题、缓存行和伪共享、指令乱序执行问题,以及如何通过`volatile`关键字和`synchronized`关键字来保证数据的有序性和可见性。
22 3
|
2月前
|
SQL XML Java
mybatis复习03,动态SQL,if,choose,where,set,trim标签及foreach标签的用法
文章介绍了MyBatis中动态SQL的用法,包括if、choose、where、set和trim标签,以及foreach标签的详细使用。通过实际代码示例,展示了如何根据条件动态构建查询、更新和批量插入操作的SQL语句。
mybatis复习03,动态SQL,if,choose,where,set,trim标签及foreach标签的用法
|
25天前
|
Java 关系型数据库 MySQL
springboot学习五:springboot整合Mybatis 连接 mysql数据库
这篇文章是关于如何使用Spring Boot整合MyBatis来连接MySQL数据库,并进行基本的增删改查操作的教程。
42 0
springboot学习五:springboot整合Mybatis 连接 mysql数据库
|
2月前
|
Java 关系型数据库 数据库连接
mybatis-plus学习
MyBatis-Plus ,MyBatis 最佳搭档,只做增强不做改变,为简化开发、提高效率而生。
44 5
|
2月前
|
SQL XML Java
mybatis :sqlmapconfig.xml配置 ++++Mapper XML 文件(sql/insert/delete/update/select)(增删改查)用法
当然,这些仅是MyBatis功能的初步介绍。MyBatis还提供了高级特性,如动态SQL、类型处理器、插件等,可以进一步提供对数据库交互的强大支持和灵活性。希望上述内容对您理解MyBatis的基本操作有所帮助。在实际使用中,您可能还需要根据具体的业务要求调整和优化SQL语句和配置。
44 1