Mybatis緩存詳解

2021-01-20 計算機java編程

mybatis是一個查詢資料庫的封裝框架,主要是封裝提供靈活的增刪改sql,開發中,service層能夠通過mybatis組件查詢和修改資料庫中表的數據;作為查詢工具,mybatis有使用緩存,這裡講一下mybatis的緩存相關源碼。

緩存

在計算機裡面,任何信息都有源頭,緩存一般指源頭信息讀取後,放在內存或者其他讀取較快的地方,下次讀取相同信息不去源頭查詢而是直接從內存(或者能快速存取的硬體)讀取。這樣可以減少硬體使用,提高讀取速度。

mybatis也是這樣,查詢資料庫的數據之後,mybatis可以把查詢結果緩存到內存,下次查詢如果查詢語句相同,並且查詢相關的表的數據沒被修改過,就可以直接返回緩存中的結果,而不用去查詢資料庫的語句,有效節省了時間。

關於mybatis中一級和二級緩存命名疑問

緩存概念較用於CPU讀取數據,有一級和二級緩存,讀取順序是先一級緩存,再二級緩存。

按照這個概念,通過源碼了解mybatis的Mapper中的緩存是一級緩存,SqlSession的中緩存是二級緩存。看到一些介紹mybatis緩存的相關文章命名反過來的,稱SqlSession中的緩存稱為一級緩存,對此有疑惑……

簡單看一下mybatis緩存相關源碼

Mapper中的緩存(一級)

mapper中的緩存,默認配置是開啟,但需要在映射文件mapper.xml中添加<cache/>標籤

配置false可以關閉mapper中的緩存

mapper緩存的解析

org.apache.ibatis.builder.xml.XMLMapperBuilder

org.apache.ibatis.builder.MapperBuilderAssistant.useNewCache():

在映射文件mapper中如果沒有cache標籤,解析時不會執行上面的useNewCache方法,cache為null,就不會使用mapper緩存(相當於失效)。

查詢使用mapper緩存邏輯

org.apache.ibatis.executor.CachingExecutor :

上面代碼中ms對象(MappedStatement )是在系統啟動時創建的對象,cache也是,不與SqlSession綁定,所以SqlSession不同,mapper緩存依然可以使用,這區別於SqlSession中的緩存。

SqlSession中的緩存(二級)

通過查看源碼可知,SqlSsession中是有緩存的,所以每次(新請求)會話SqlSession不同,緩存是空的;相同的SqlSession中的緩存才有效。

mybatis默認Sqlsession:org.apache.ibatis.session.defaults.DefaultSqlSession

構造方法中傳入executor(查詢執行對象)

executor中攜帶二級緩存成員變量:

查詢使用SqlSession緩存邏輯

org.apache.ibatis.executor.BaseExecutor.query()

二級緩存和一級緩存不用想,資料庫的數據被修改時要清空緩存,不然數據有誤;至於怎麼清空,是另一套邏輯,mapper中的cache標籤可以配置一些參數,比如緩存定期清空。

一級二級緩存先後順序

從概念上來將,先讀取的就是一級緩存,後讀取是二級緩存

通過源碼可以知道這裡使用了類似裝飾者模式的設計,在創建Executor的時候,邏輯如下

所以當開啟緩存的時候,查詢邏輯從CachingExecutor.query開始

在SqlSession查詢數據的時候,按照代碼邏輯:

1 CachingExecutor.query 中嘗試讀取mapper中的緩存(一級)

org.apache.ibatis.executor.CachingExecutor.query()

2 BaseExecutor.query 中嘗試讀取SqlSession中的緩存(二級)

org.apache.ibatis.executor.BaseExecutor.query()

最後一級二級緩存都沒有,就查詢資料庫

相關焦點

  • Mybatis 一級緩存、二級緩存
    查詢緩存目前Mybatis中提供了兩個,分別是:一級緩存、二級緩存;一級緩存先說一下一級緩存的範圍:同一個SqlSession對象,也就說,我們是同一個SqlSession對象,又要進行同樣的查詢操作,那麼,我們就可以去緩存中獲取;所以,SqlSession的緩存,是屬於一級緩存;那,又有什麼用呢?
  • Mybatis第三講 緩存與註解
    DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"><configuration> <properties resource="db.properties"
  • 手寫mybatis框架-增加緩存&事務功能
    增加代碼詳解緩存 com.simple.ibatis.cache緩存接口-Cache/**移除key的緩存*/ void removeCache(String key);}自定義框架緩存接口,提供基本的增刪改查功能。
  • Mybatis一級緩存和二級緩存的產生和銷毀
    分頁參數必須相同,緩存粒度的是整個分頁結果集,而不是結果集中的對象 RowBounds rowBounds1 = new RowBounds(0, 1); List<TempEntity> tempEntity1 = sqlSession.selectList("com.mybatis.TempDao.list"
  • 關於 Mybatis 緩存的那點事兒,你知道嗎?
    一級緩存基於 PerpetualCache 的 HashMap 本地緩存(mybatis 內部實現 cache 接口),其存儲作用域為 Session,當 Session flush 或 close 之後,該 Session 中的所有 Cache 就將清空;
  • Mybatis基本知識十六:查詢緩存之第三方查詢緩存
    ehcache下載:https://github.com/mybatis/ehcache-cache/releases3.ehcache查詢緩存的使用配置ehcache查詢緩存的使用配置時需注意以下幾點
  • mybatis的Configuration詳解
    上一篇介紹了mybatis中SqlSessionFactory的創建過程,今天來學習它默認實現中的唯一屬性Configuration。利用mybatis查出數據只用三步:創建SqlSessionFactory、通過SqlSessionFactory創建SqlSession、SqlSession執行selectOne方法。
  • Mybatis基本知識十五:查詢緩存之二級查詢緩存(內置)
    DEBUG [main] - Cache Hit Ratio [com.mybatis.dao.ProductInfoDao]: 0.0DEBUG [main] - ==> Preparing: select * from productInfo where id = ?
  • 給我五分鐘,帶你徹底掌握MyBatis的緩存工作原理
    一級緩存真的存在嗎package com.lonelyWolf.mybatis;import com.lonelyWolf.mybatis.mapper.UserAddressMapper;import com.lonelyWolf.mybatis.mapper.UserMapper;import com.lonelyWolf.mybatis.model.LwUser;import org.apache.ibatis.io.Resources;import org.apache.ibatis.session.SqlSession;import org.apache.ibatis.session.SqlSessionFactory
  • 面試官口中的Mybatis,工作流程、架構分層模塊劃分以及緩存機制
    它包含了控制mybatis的行為以及對資料庫下達的指令(SQL操作)。1、在mybatis-config.xml中配置(默認是true)<!-- 默認是false(安全),改為true可讀寫時,對象必須支持序列化 -->Cache屬性詳解:
  • Mybatis中mapper相關註解解析類詳解
    接著上一篇通過掃描接口添加mapper的方法會創建MapperAnnotationBuilder並執行parse方法,具體源碼如下圖:MapperAnnotationBuilder關鍵屬性說明:statementAnnotationTypes:靜態屬性,存有各種sql對於在mybatis
  • Mybatis的SqlSession創建過程詳解
    前面mybatis的初始化過程分析完成,接下來是第二步SqlSession的創建。 創建過程總覽 SqlSession創建過程如下圖:
  • MyBatis:緩存,延遲加載,註解應用
    一句話概括:經常查詢一些不經常發生變化的數據,使用緩存來提高查詢效率。像大多數的持久化框架一樣,MyBatis 也提供了緩存策略,通過緩存策略來減少資料庫的查詢次數,從而提高性能。 MyBatis 中緩存分為一級緩存,二級緩存。
  • mybatis從入門到精通,第四篇《一二級緩存》,乾貨滿滿
    MyBatis 內置了一個強大的事務性查詢緩存機制(目的:優化查詢效率),它可以非常方便地配置和定製。 為了使它更加強大而且易於配置, MyBatis 3 中的緩存實現進行了許多改進。默認情況下,只啟用了本地的會話緩存,它僅僅對一個會話中的數據進行緩存。
  • 從零開始手寫 mybatis(四)- mybatis 事務管理機制詳解
    前景回顧第一節 從零開始手寫 mybatis(一)MVP 版本 中我們實現了一個最基本的可以運行的 mybatis。第二節 從零開始手寫 mybatis(二)mybatis interceptor 插件機制詳解第三節 從零開始手寫 mybatis(三)jdbc pool 從零實現資料庫連接池本節我們一起來學習一下 mybatis 中的事務管理。
  • 如何讓 Mybatis 自動生成代碼,提高開發效率
    如果不知道怎麼改, 請看後面的配置詳解。  1.3 配置 pom.xml  在原基礎上添加一些內容。>mybatis-generatorartifactId>1.0-SNAPSHOTversion>  mybatis-generatorfinalName>org.mybatis.generatorgroupId>mybatis-generator-maven-pluginartifactId>1.3.7version
  • mybatis——優秀的持久層框架
    1.mybatis的作用mybatis是一款優秀的持久層框架。傳統的JDBC(資料庫連接)主要完成建立與資料庫的連接、發送SQL語句和處理資料庫返回結果。但是在實現這些功能需要繁瑣的步驟和代碼,而mybatis很好解決了這些問題。
  • Mybatis頻率最高的面試題及答案
    mybatis是一個優秀的基於Java持久層框架,內部它是封裝了JDBC,讓開發者不用過多的關心什麼創建連接、加載驅動啊等等。如今大企業越來越多用mybatis,為什麼它越來越被廣泛應用,以前流行的SSH框架開發,而現在完全勢向於SSM框架開發,今天講解mybatis框架常見面試題。
  • Mybatis工作流程及其原理
    (3)hibernate擁有完整的日誌系統,mybatis則欠缺一些hibernate日誌系統非常健全,涉及廣泛,包括:sql記錄、關係異常、優化警告、緩存提示、髒數據警告等;而mybatis則除了基本記錄功能外,功能薄弱很多。
  • MyBatis的執行流程詳解
    mybatis-config.xml為MyBatis的全局配置文件,用於配置資料庫連接、屬性、類型別名、類型處理器、插件、環境配置、映射器(mapper.xml)等信息,這個過程中有一個比較重要的部分就是映射文件其實是配在這裡的;這個核心配置文件最終會被封裝成一個Configuration對象加載映射文件。