iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >带你深入理解MyBatis缓存机制
  • 248
分享到

带你深入理解MyBatis缓存机制

2024-04-02 19:04:59 248人浏览 独家记忆

Python 官方文档:入门教程 => 点击学习

摘要

目录一、简介1、缓存机制介绍2. 一级缓存和二级缓存二、一级缓存三、二级缓存3.1 mybatis自带的二级缓存3.1.1 代码测试二级缓存3.1.2 查询结果存入二级缓存的时机3.

一、简介

1、缓存机制介绍

当客户端发起一次查询请求时,首先通过java程序进行网络传输访问Mysql数据库及对应的数据的服务器硬盘,当第二次的请求也是查询相同的数据时再通过这个流程显然有点“浪费”上次请求访问到的资源,所以我们将第一次查询到的数据存到缓存区域,当发生下一次相同请求时直接在缓存区域拿就行了。

2. 一级缓存和二级缓存

①使用顺序

查询的顺序是:

  • 先查询二级缓存,因为二级缓存中可能会有其他程序已经查出来的数据,可以拿来直接使用。
  • 如果二级缓存没有命中,再查询一级缓存
  • 如果一级缓存也没有命中,则查询数据库
  • sqlSession关闭之前,一级缓存中的数据会写入二级缓存

②效用范围

一级缓存:SqlSession级别二级缓存:SqlSessionFactory级别

它们之间范围的大小参考下面图:

二、一级缓存

当使用相同查询条件查询数据时,一共只打印了一条SQL语句,两个变量指向同一个对象。

一级缓存失效的情况:

  • 不是同一个SqlSession
  • 同一个SqlSession但是查询条件发生了变化
  • 同一个SqlSession两次查询期间执行了任何一次增删改操作
  • 同一个SqlSession两次查询期间手动清空了缓存
  • 同一个SqlSession两次查询期间提交了事务

三、二级缓存

3.1 mybatis自带的二级缓存

3.1.1 代码测试二级缓存

① 开启二级缓存功能

在想要使用二级缓存的Mapper配置文件中加入cache标签


<mapper namespace="com.zenGChuiyu.mybatis.dao.EmployeeMapper">
    <!-- 启动二级缓存功能 -->
    <cache/>

②让实体类支持序列化


public class Employee implements Serializable {

③junit测试

这个功能的测试操作需要将SqlSessionFactory对象设置为成员变量


public class CacheTest {

    private SqlSessionFactory factory;

    @Before
    public void init() throws IOException {

        factory = new SqlSessionFactoryBuilder().build(Resources.getResourceAsStream("mybatis-config.xml"));

    }

    //测试二级缓存,(mybatis自带的)
    @Test
    public void test1(){

        SqlSession session = factory.openSession();

        EmployeeMapper mapper = session.getMapper(EmployeeMapper.class);

        Employee employee = mapper.selectEmpById(2);
        System.out.println("employee = " + employee);

        //在执行第二次查询前,关闭当前SqlSession
        session.close();

        //开启新的SqlSession
        session = factory.openSession();

        mapper = session.getMapper(EmployeeMapper.class);
        employee = mapper.selectEmpById(2);
        System.out.println("employee = " + employee);

        session.close();
    }
}

打印效果:

22:48:18.669 [main] DEBUG com.zengchuiyu.mybatis.dao.EmployeeMapper - Cache Hit Ratio [com.zengchuiyu.mybatis.dao.EmployeeMapper]: 0.5

④缓存命中率

日志中打印的Cache Hit Ratio叫做缓存命中率


Cache Hit Ratio [com.atguigu.mybatis.EmployeeMapper]: 0.0(0/1)
Cache Hit Ratio [com.atguigu.mybatis.EmployeeMapper]: 0.5(1/2)
Cache Hit Ratio [com.atguigu.mybatis.EmployeeMapper]: 0.6666666666666666(2/3)
Cache Hit Ratio [com.atguigu.mybatis.EmployeeMapper]: 0.75(3/4)
Cache Hit Ratio [com.atguigu.mybatis.EmployeeMapper]: 0.8(4/5)

缓存命中率=命中缓存的次数/查询的总次数

3.1.2 查询结果存入二级缓存的时机

结论:SqlSession关闭的时候,一级缓存中的内容会被存入二级缓存

3.1.3 二级缓存相关配置

  • eviction属性:缓存回收策略

LRU(Least Recently Used) – 最近最少使用的:移除最长时间不被使用的对象。

FIFO(First in First out) – 先进先出:按对象进入缓存的顺序来移除它们。

SOFT – 软引用:移除基于垃圾回收器状态和软引用规则的对象。

WEAK – 弱引用:更积极地移除基于垃圾收集器状态和弱引用规则的对象。

默认的是 LRU。

  • flushInterval属性:刷新间隔,单位毫秒

默认情况是不设置,也就是没有刷新间隔,缓存仅仅调用语句时刷新

  • size属性:引用数目,正整数

代表缓存最多可以存储多少个对象,太大容易导致内存溢出

  • readOnly属性:只读,true/false

true:只读缓存;会给所有调用者返回缓存对象的相同实例。因此这些对象不能被修改。这提供了很重要的性能优势。

false:读写缓存;会返回缓存对象的拷贝(通过序列化)。这会慢一些,但是安全,因此默认是 false。

四、整合EHCache

4.1 EHCache简介

官网地址:https://www.ehcache.org/

Ehcache is an open source, standards-based cache that boosts perfORMance, offloads your database, and simplifies Scalability. It's the most widely-used Java-based cache because it's robust, proven, full-featured, and integrates with other popular libraries and frameworks. Ehcache scales from in-process caching, all the way to mixed in-process/out-of-process deployments with terabyte-sized caches.

Ehcache是一个开源的,基于标准的缓存,可以提高性能,卸载数据库,简化可伸缩性。它是最广泛使用的基于java的缓存,因为它健壮、可靠、功能齐全,并与其他流行的库和框架集成。Ehcache从进程内缓存扩展到具有tb大小缓存的进程内/进程外混合部署。

4.2 整合操作

①Mybatis环境

在Mybatis环境下整合EHCache,前提当然是要先准备好Mybatis的环境

②添加依赖

依赖信息:


<!-- Mybatis EHCache整合包 -->
<dependency>
    <groupId>org.mybatis.caches</groupId>
    <artifactId>mybatis-ehcache</artifactId>
    <version>1.2.1</version>
</dependency>
<!-- slf4j日志门面的一个具体实现 -->
<dependency>
    <groupId>ch.qos.logback</groupId>
    <artifactId>logback-classic</artifactId>
    <version>1.2.3</version>
</dependency>

依赖传递情况:

各主要jar包作用

jar包名称 作用
mybatis-ehcache Mybatis和EHCache的整合包
ehcache EHCache核心包
slf4j-api SLF4J日志门面包
logback-classic 支持SLF4J门面接口的一个具体实现

③整合EHCache

[1]创建EHCache配置文件

ehcache.xml

[2]文件内容


<?xml version="1.0" encoding="utf-8" ?>
<ehcache xmlns:xsi="Http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="../config/ehcache.xsd">
    <!-- 磁盘保存路径 -->
    <diskStore path="D:\zengchuiyu\ehcache"/>
    
    <defaultCache
            maxElementsInMemory="1000"
            maxElementsOnDisk="10000000"
            eternal="false"
            overflowToDisk="true"
            timeToIdleSeconds="120"
            timeToLiveSeconds="120"
            diskExpiryThreadIntervalSeconds="120"
            memoryStoreEvictionPolicy="LRU">
    </defaultCache>
</ehcache>

引入第三方框架或工具时,配置文件的文件名可以自定义吗?
可以自定义:文件名是由我告诉其他环境
不能自定义:文件名是框架内置的、约定好的,就不能自定义,以避免框架无法加载这个文件

④加入logback日志

存在SLF4J时,作为简易日志的log4j将失效,此时我们需要借助SLF4J的具体实现logback来打印日志。

[1]各种Java日志框架简介

门面:

名称 说明
JCL(Jakarta Commons Logging) 陈旧
SLF4J(Simple Logging Facade for Java)★ 适合
jboss-logging 特殊专业领域使用

实现:

名称 说明
log4j★ 最初版
JUL(java.util.logging) jdk自带
log4j2 Apache收购log4j后全面重构,内部实现和log4j完全不同
logback★ 优雅、强大

注:标记★的技术是同一作者。

[2]logback配置文件


<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="true">
    <!-- 指定日志输出的位置 -->
    <appender name="STDOUT"
        class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <!-- 日志输出的格式 -->
            <!-- 按照顺序分别是:时间、日志级别、线程名称、打印日志的类、日志主体内容、换行 -->
            <pattern>[%d{HH:mm:ss.SSS}] [%-5level] [%thread] [%logger] [%msg]%n</pattern>
        </encoder>
    </appender>
    
    <!-- 设置全局日志级别。日志级别按顺序分别是:DEBUG、INFO、WARN、ERROR -->
    <!-- 指定任何一个日志级别都只打印当前级别和后面级别的日志。 -->
    <root level="DEBUG">
        <!-- 指定打印日志的appender,这里通过“STDOUT”引用了前面配置的appender -->
        <appender-ref ref="STDOUT" />
    </root>
    
    <!-- 根据特殊需求指定局部日志级别 -->
    <logger name="com.atguigu.crowd.mapper" level="DEBUG"/>
    
</configuration>

⑤ EHCache配置文件说明

当借助CacheManager.add(“缓存名称”)创建Cache时,EhCache便会采用指定的的管理策略。

defaultCache标签各属性说明:

五、缓存基本原理

5.1 Cache接口

① 顶级接口

org.apache.ibatis.cache.Cache接口:所有缓存都必须实现的顶级接口

② Cache接口中的方法


③ 缓存的本质

根据Cache接口中方法的声明我们能够看到,缓存的本质是一个Map

5.2 PerpetualCache

org.apache.ibatis.cache.impl.PerpetualCache是Mybatis的默认缓存,也是Cache接口的默认实现。Mybatis一级缓存和自带的二级缓存都是通过PerpetualCache来操作缓存数据的。但是这就奇怪了,同样是PerpetualCache这个类,怎么能区分出来两种不同级别的缓存呢?

其实很简单,调用者不同。

一级缓存:由BaseExecutor调用PerpetualCache

二级缓存:由CachingExecutor调用PerpetualCache,而CachingExecutor可以看做是对BaseExecutor的装饰

总结

到此这篇关于MyBatis缓存机制的文章就介绍到这了,更多相关MyBatis缓存机制内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: 带你深入理解MyBatis缓存机制

本文链接: https://www.lsjlt.com/news/137866.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 带你深入理解MyBatis缓存机制
    目录一、简介1、缓存机制介绍2. 一级缓存和二级缓存二、一级缓存三、二级缓存3.1 mybatis自带的二级缓存3.1.1 代码测试二级缓存3.1.2 查询结果存入二级缓存的时机3....
    99+
    2024-04-02
  • 带你深入了解java-代理机制
    目录1-代理模式1.1静态代理1.2 动态代理1.2 Cglib代理总结1-代理模式 代理(Proxy)是一种设计模式。提供了对目标对象另外的访问方式,即通过代理对象访问目标对象,这...
    99+
    2024-04-02
  • 深入理解MySQL中MVCC与BufferPool缓存机制
    目录一、MVCC机制undo日志版本链与read-view机制版本链比对规则二、BufferPool机制三、总结一、MVCC机制 MVCC(Multi Version Concurr...
    99+
    2024-04-02
  • GetChar缓存机制深入剖析
    与缓存区相关最常见的操作就是字符的输入与输出操作getchar,getc,getch,getche,gets系列函数。 第一个例子(与getchar有关):复制代码 代码如下:#in...
    99+
    2022-11-15
    GetChar 缓存机制
  • 带你深入了解Android的事件分发机制
    Android的事件分发机制是指在Android系统中,如何将用户的触摸事件、按键事件等传递给正确的View进行处理的一套机制。它是Android应用程序中实现交互的重要部分,确保用户的操作能够被正确地捕获和处理。 Android的事件分发...
    99+
    2023-08-18
    android android studio ui 知识图谱 事件分发
  • 带你深入理解Java异常
    💕“人生就像一盘棋,有时候你慢一步,就输掉了一局。但只要你不停止思考和行动,就永远有机会翻盘。”💕 🐼作者:不能再留遗憾了🐼 &#x...
    99+
    2023-10-05
    java jvm 开发语言
  • Mybatis缓存机制(一级缓存、二级缓存、三级缓存)
    一、含义: 缓存就是内存中的数据,常常来自对数据库查询结果的保存。 使用缓存,我们可以避免频繁与数据库进行交互,从而提高响应速度。 Mybatis的缓存分为一级缓存、二级缓存、三级缓存。 一...
    99+
    2023-09-02
    mybatis 缓存 java
  • 一文带你深入理解GolangContext包
    目录1. 基本原理1.1 Context 包的介绍1.2 Context 的创建1.2.1 WithCancel1.2.2 WithDeadline1.2.3 WithTimeout...
    99+
    2023-05-18
    Golang Context包 Golang Context
  • 缓存的齿轮:深入了解 ASP 页面片段缓存的内部机制
    引言 ASP.NET 页面片段缓存是一个强大的功能,它可以显著提高 web 应用程序的性能。通过将页面的片断存储在内存中,缓存机制减少了对数据库和文件系统的访问,从而加快了页面加载时间。 缓存的齿轮:深入了解 ASP 页面片段缓存 工作原...
    99+
    2024-03-05
    ASP.NET 页面片段缓存 缓存依赖项 缓存策略 性能优化
  • 深入浅析MyBatis中的一级缓存与二级缓存
    本篇文章给大家分享的是有关深入浅析MyBatis中的一级缓存与二级缓存,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。MyBatis缓存我们知道,频繁的数据库操作是非常耗费性能的...
    99+
    2023-05-31
    mybatis 二级缓存 一级缓存
  • 缓存的奥义:深入理解 ASP 页面片段缓存
    ASP 页面片段缓存的原理 ASP 页面片段缓存允许将动态生成的页面片段存储在服务器内存中,从而避免每次请求时都重新生成这些片段。当用户访问网站时,服务器首先检查缓存中是否存在所请求的页面片段。如果存在,则直接从缓存中检索并返回该片段,...
    99+
    2024-02-21
    ASP 页面片段缓存 性能优化 Web 应用程序
  • MyBatis 动态SQL和缓存机制实例详解
    有的时候需要根据要查询的参数动态的拼接SQL语句常用标签:- if:字符判断- choose【when...otherwise】:分支选择- trim【where,set】:字符串截取,其中where标签封装查询条件,s...
    99+
    2023-05-31
    mybatis 动态sql 缓存机制
  • WCF缓存机制怎么理解
    这篇文章主要讲解了“WCF缓存机制怎么理解”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“WCF缓存机制怎么理解”吧!缓存是很占内存的,缓存也有它的好处,这里就WCF缓存机制分析一个案例,希望...
    99+
    2023-06-17
  • PHP缓存机制详解:深入探究其工作原理和实际应用
    PHP缓存机制全解析:深入理解其原理与应用 引言:在开发Web应用程序中,缓存是一种重要的技术手段,能够显著提升应用程序的性能和用户体验。而PHP作为一种常用的服务器端编程语言,也提供了丰富的缓存机制供开发者使用。本文将深入探讨...
    99+
    2024-01-23
    深入理解 原理与应用 PHP缓存机制
  • 一文带你深入理解Golang中的RWMutex
    目录RWMutex 的整体模型读操作模型写操作模型基本用法一个简单的例子RWMutex 使用的注意事项源码剖析RWMutex 结构体读锁源码剖析写锁源码剖析TryRLock 和 Tr...
    99+
    2023-05-14
    Golang RWMutex原理 Golang RWMutex使用 Golang RWMutex
  • 带你深入了解Vue.$nextTick(原理浅析)
    白话一点就是说,其实这是和JS当中的事件循环是息息相关的,就是Vue不可能对每一个数据变化都做一次渲染,它会把这些变化先放在一个异步的队列当中,同时它还会对这个队列里面的操作进行去重,比如你修改了这个数据三次,它只会保留最后一次。这些变化是...
    99+
    2023-05-14
    $nextTick 前端 Vue.js
  • Flutter图片加载与缓存机制的深入探究
    目录前言图片控件 图片解析 缓存管理 ​新增缓存 缓存清理 图片加载 滑动中处理 总结 前言 今天来学习一下 Flutter 自身是如何加载图片和管理图片的。 Flutt...
    99+
    2024-04-02
  • Java应用的缓存机制,你了解吗?
    在Java应用中,缓存机制是一个非常重要的概念,它可以提高应用程序的性能和响应速度。缓存机制的基本原理是将频繁访问的数据存储在内存中,避免每次访问都需要从磁盘或数据库中读取数据。在本文中,我们将探讨Java应用中的缓存机制。 一、什么是缓...
    99+
    2023-06-18
    索引 打包 缓存
  • 深入理解go缓存库freecache的使用
    目录1初始化2读写流程3总结go开发缓存场景一般使用map或者缓存框架,为了线程安全会使用sync.Map或线程安全的缓存框架。 缓存场景中如果数据量大于百万级别,需要特别考虑数据类...
    99+
    2024-04-02
  • Java反射机制深入理解
    Java反射机制深入理解一.概念   反射就是把Java的各种成分映射成相应的Java类。Class类的构造方法是private,由JVM创建。反射是java语言的一个特性,它允程序在运行时(注意不是编译的时候)来进行自我检查并且对内部的成...
    99+
    2023-05-31
    java 反射机制 ava
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作