亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Mybatis?一級緩存和二級緩存原理區(qū)別

 更新時間:2022年09月22日 11:16:42   作者:mikechen的互聯(lián)網(wǎng)架構  
這篇文章主要介紹了Mybatis?一級緩存和二級緩存原理區(qū)別?,文章通過圍繞主題展開詳細的內容介紹,具有一定的參考價值,需要的小伙伴可以參考一下

Java面試經(jīng)常問到Mybatis一級緩存和二級緩存,今天就給大家重點詳解Mybatis一級緩存和二級緩存原理與區(qū)別

Mybatis緩存

緩存就是內存中的數(shù)據(jù),常常來自對數(shù)據(jù)庫查詢結果的保存,使用緩存可以避免頻繁與數(shù)據(jù)庫進行交互,從而提高查詢響應速度。

MyBatis 提供了對緩存的支持,分為一級緩存和二級緩存,如下圖所示:

我們先大致了解下MyBatis一級緩存與MyBatis 二級緩存:

一級緩存:SqlSession級別的緩存,緩存的數(shù)據(jù)只在SqlSession內有效。

二級緩存:mapper級別的緩存,同一個namespace公用這一個緩存,所以對SqlSession是共享的,二級緩存需要我們手動開啟。

下面我們再分別詳解兩者的原理與區(qū)別。

Mybatis一級緩存

1.為什么需要Mybatis一級緩存

當我們使用Mybatis進行數(shù)據(jù)庫的操作時候,會創(chuàng)建一個SqlSession來進行一次數(shù)據(jù)庫的會話,會話結束則關閉SqlSession對象。

如果我們很有可能多次查詢完全相同的sql語句,每一次查詢都查詢一次數(shù)據(jù)庫,那查詢數(shù)據(jù)庫代價是比較大的,這會導致系統(tǒng)的資源浪費。

為了解決這個問題,Mybatis對每一次會話都添加了緩存操作,不用相同的SQL每次都需要查詢數(shù)據(jù)庫,這就是Mybatis一級緩存的作用。

2.Mybatis一級緩存的實現(xiàn)

我們知道對SqlSession的操作,mybatis內部都是通過Executor來執(zhí)行的,Executor的生命周期和SqlSession是一致的。

Mybatis在Executor中創(chuàng)建了本地緩存(一級緩存),如下圖所示:

大致的流程如下:

第一次查詢用戶id信息,先去緩存中查詢是否有,如果沒有,從數(shù)據(jù)庫中查詢用戶信息,得到用戶信息后在將用戶信息儲存到一級緩存中。

如果sqlSession去執(zhí)行commit操作(插入、更新、刪除),清空sqlSession中的一級緩存,保證緩存中始終保存的是最新的信息,避免臟讀。

第二次查詢用戶id信息,先去緩存中查詢,如緩存中有,直接從緩存中獲取。

注意:兩次查詢須在同一個sqlsession中完成,否則將不會走mybatis的一級緩存。

在mybatis與spring進行整合開發(fā)時,事務控制在service中進行,重復調用兩次servcie將不會走一級緩存,因為在第二次調用時session方法結束,SqlSession就關閉了。

3.Mybatis一級緩存配置

mybatis一級緩存的范圍有SESSION和STATEMENT兩種,默認是SESSION。

如果不想使用一級緩存,可以把一級緩存的范圍指定為STATEMENT,這樣每次執(zhí)行完一個Mapper中的語句后都會將一級緩存清除。

如果需要更改一級緩存的范圍,可以在Mybatis的配置文件中,在下通過localCacheScope指定。

<setting name="localCacheScope" value="STATEMENT"/>

Mybatis二級緩存

1.為什么需要Mybatis二級緩存?

MyBatis 一級緩存最大的共享范圍就是一個SqlSession內部,那么如果多個 SqlSession 需要共享緩存,則需要開啟二級緩存。

2.Mybatis二級緩存的實現(xiàn)

開啟二級緩存后,會使用 CachingExecutor 裝飾 Executor,進入一級緩存的查詢流程前,先在 CachingExecutor 進行二級緩存的查詢,具體的工作流程如下所示。

二級緩存開啟后,同一個 namespace 下的所有操作語句,都影響著同一個 Cache,即二級緩存被多個 SqlSession 共享,是一個全局的變量。

當開啟緩存后,數(shù)據(jù)的查詢執(zhí)行的流程就是 二級緩存 -> 一級緩存 -> 數(shù)據(jù)庫。

MyBatis 是默認關閉二級緩存的,因為對于增刪改操作頻繁的話,那么二級緩存形同虛設,每次都會被清空緩存。

Mybatis一級緩存與二級緩存的區(qū)別

1)一級緩存 Mybatis的一級緩存是指SQLSession,一級緩存的作用域是SQlSession, Myabits默認開啟一級緩存。

在同一個SqlSession中,執(zhí)行相同的SQL查詢時;第一次會去查詢數(shù)據(jù)庫,并寫在緩存中,第二次會直接從緩存中取。 當執(zhí)行SQL時候兩次查詢中間發(fā)生了增刪改的操作,則SQLSession的緩存會被清空。

每次查詢會先去緩存中找,如果找不到,再去數(shù)據(jù)庫查詢,然后把結果寫到緩存中。 Mybatis的內部緩存使用一個HashMap,key為hashcode+statementId+sql語句。Value為查詢出來的結果集映射成的java對象。 SqlSession執(zhí)行insert、update、delete等操作commit后會清空該SQLSession緩存。

2) Mybatis二級緩存是默認不開啟的,作用于一個Application,是Mapper級別的,多個SqlSession使用同一個Mapper的sql能夠使用二級緩存。

到此這篇關于Mybatis 一級緩存和二級緩存原理區(qū)別 的文章就介紹到這了,更多相關Mybatis 緩存內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • SpringBoot+Maven 多模塊項目的構建、運行、打包實戰(zhàn)

    SpringBoot+Maven 多模塊項目的構建、運行、打包實戰(zhàn)

    這篇文章主要介紹了SpringBoot+Maven 多模塊項目的構建、運行、打包實戰(zhàn),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-05-05
  • Java嵌入式開發(fā)的優(yōu)勢及有點總結

    Java嵌入式開發(fā)的優(yōu)勢及有點總結

    在本篇內容里小編給大家整理了關于Java嵌入式開發(fā)的優(yōu)勢及相關知識點內容,有興趣的朋友們學習下。
    2022-11-11
  • IntelliJ IDEA下自動生成Hibernate映射文件以及實體類

    IntelliJ IDEA下自動生成Hibernate映射文件以及實體類

    這篇文章主要介紹了IntelliJ IDEA下自動生成Hibernate映射文件以及實體類,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-11-11
  • 關于Java使用Http輕量級請求庫Unirest的方法

    關于Java使用Http輕量級請求庫Unirest的方法

    這篇文章主要介紹了關于Java使用Http輕量級請求庫Unirest的方法,Unirest 是一個輕量級的 HTTP 請求庫,可發(fā)起 GET, POST, PUT, PATCH, DELETE, HEAD, OPTIONS 請求,支持 Node、Ruby、Java、PHP、Python、Objective-C、.NET 等多種語言,需要的朋友可以參考下
    2023-08-08
  • 實現(xiàn) Java 本地緩存的方法解析

    實現(xiàn) Java 本地緩存的方法解析

    這篇文章主要介紹了實現(xiàn) Java 本地緩存的方法解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-10-10
  • 基于HttpClient上傳文件中文名亂碼的解決

    基于HttpClient上傳文件中文名亂碼的解決

    這篇文章主要介紹了HttpClient上傳文件中文名亂碼的解決方案,具有很好的參考價值,希望對大家有所幫助。
    2021-07-07
  • SpringBoot獲取不到用戶真實IP的解決方法

    SpringBoot獲取不到用戶真實IP的解決方法

    最近遇到個問題,項目部署后發(fā)現(xiàn)服務端無法獲取到客戶端真實的IP地址,本文就來介紹一下這個問題的解決方法,感興趣的可以了解一下
    2023-08-08
  • Android內存泄漏實戰(zhàn)解析

    Android內存泄漏實戰(zhàn)解析

    Java是垃圾回收語言的一種。這篇文章主要介紹了Android內存泄漏 的相關資料,需要的朋友可以參考下
    2016-10-10
  • Springboot單體架構http請求轉換https請求來支持微信小程序調用接口

    Springboot單體架構http請求轉換https請求來支持微信小程序調用接口

    這篇文章主要介紹了Springboot單體架構http請求轉換https請求來支持微信小程序調用接口,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-11-11
  • Spring 注入static屬性值方式

    Spring 注入static屬性值方式

    文本介紹了Spring如何從屬性文件給static屬性注入值,在寫一些與配置相關的工具類時常用。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-09-09

最新評論