后端:MyBatis緩存知識介紹

? ? ? ? ? ? ? ?

今天給大家分享一下MyBatis緩存知識介紹,希望對大家日常的開發當中能有所幫助!

一、MyBatis一級緩存

1、一級緩存介紹

當我們的程序MyBatis開啟一次和數據庫的會話,MyBatis會自動創建出一個SqlSession對象表示這一次數據庫的會話。在同一個數據庫會話當中,MyBatis提供了一級緩存的方案優化這部分場景,針對相同的SQL查詢語句,會優先命中一級緩存,避免再次對數據庫進行查詢,從而提高查詢性能、減輕數據庫的壓力。

? ? ? ? ? ? ? ?

開啟一級緩存

MyBatis的配置文件加上如下:

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

注意:localCacheScope 值有兩個 SESSION(開啟一級緩存)/Statement(關閉一級緩存)

一級緩存失效場景

  • SqlSeesion實例不同

  • SqlSeesion實例相同,查詢條件不同

  • SqlSeesion對象相同,查詢條件也相同,但兩次查詢之間執行了增刪改操作

  • SqlSeesion對象相同,兩次查詢條件相同,中間無其它增刪改操作,但使用了clearCache()方法

總結

  • MyBatis一級緩存的生命周期和SqlSession一致。默認是開啟狀態。

  • MyBatis一級緩存采用HashMap性能較差

  • 分布式環境下對數據庫操作容易引起臟數據,不推薦開啟MyBatis一級緩存

二、MyBatis二級緩存

1、二級緩存介紹

MyBatis一級緩存生命周期是一個SqlSession內部,如果多個 SqlSession 需要共享緩存,則需要開啟二級緩存,開啟二級緩存后,會使用 CachingExecutor 裝飾 Executor,進入一級緩存的查詢流程前,先在CachingExecutor 進行二級緩存的查詢。

? ? ? ? ? ? ? ?

2、為什么有二級緩存?

1、為了避免和數據庫頻繁交互。這是設計緩存的主要原因。

2、當Spring和MyBatis整合時,每次查詢之后都要進行關閉sqlsession,關閉之后數據被清空。所以MyBatis和Spring整合之后,一級緩存是沒有意義的。如果開啟二級緩存,關閉sqlsession后,會把該sqlsession一級緩存中的數據添加到mapper namespace的二級緩存中。這樣,緩存在sqlsession關閉之后依然存在。

當開啟二級緩存數據庫查詢流程先后順序為:二級緩存 -> 一級緩存 -> 數據庫

3、如何開啟二級緩存

二級緩存默認是不開啟的,需要手動開啟二級緩存,MyBatis的配置文件加上如下:

<settings><setting name = "cacheEnabled" value = "true" /></settings>

然后在還需要在 Mapper 的xml 配置文件中加入?<cache>標簽

cache屬性介紹

eviction:設置回收策略,默認是LRU策略。

  • LRU - 最近最少回收,移除最長時間不被使用的對象

  • FIFO - 先進先出,按照緩存進入的順序來移除它們

  • SOFT - 軟引用,移除基于垃圾回收器狀態和軟引用規則的對象

  • WEAK - 弱引用,更積極的移除基于垃圾收集器和弱引用規則的對象

flushinterval:緩存刷新間隔,緩存多長時間刷新一次,默認不清空,設置一個毫秒值

readOnly: 是否只讀;true 只讀,MyBatis 認為所有從緩存中獲取數據的操作都是只讀操作,不會修改數據。MyBatis 為了加快獲取數據,直接就會將數據在緩存中的引用交給用戶。不安全,速度快。讀寫(默認):MyBatis 覺得數據可能會被修改

size : 緩存可存放多少個元素

type: 指定自定義緩存的全類名(實現Cache 接口即可)

blocking:若緩存中找不到對應的key,是否會一直blocking,直到有對應的數據進入緩存。

注意:

1、在事務提交之前,并不會真正存儲到二級緩存,而是先存儲到一個臨時屬性,等事務提交之后才會真正存儲到二級緩存。因此需要commit事務之后才能生效。

2、如果使用的是MyBatis默認緩存,結果集對象需要實現序列化接口(Serializable),否則會報錯。

4、二級緩存適用場景

1、適合頻繁訪問且用戶對查詢結果實時性要求不是很高的查詢,

這時采用二級緩存可降低數據庫訪問量,提高數據庫的性能,例如:查詢耗時較高的統計報表SQL、按固定時間維度查詢的SQL(每月的訂單信息等等)。

2、適合查詢多寫入少的場景開啟。

因為任何對數據庫的(insert、update、delete)操作都會觸發緩存的更新,從而造成緩存失效。

5、二級緩存失效場景

  • 第一次SqlSession 未提交

  • 對數據庫對應的數據表執行了的(insert、update、delete)操作

6、總結

mybatis二級緩存針對大多數的業務系統都不推薦使用,因為業務系統數據操作比較頻繁、自帶的二級緩存性能也不是很高。二級緩存很難起到實際的作用。可以引用第三方緩存。

IT技術分享社區

個人博客網站:https://programmerblog.xyz

文章推薦程序員效率:畫流程圖常用的工具程序員效率:整理常用的在線筆記軟件遠程辦公:常用的遠程協助軟件,你都知道嗎?51單片機程序下載、ISP及串口基礎知識硬件:斷路器、接觸器、繼電器基礎知識

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/270497.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/270497.shtml
英文地址,請注明出處:http://en.pswp.cn/news/270497.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

軟件:10款免費無廣告的看圖軟件,總有一款適合你

目錄 一、專業型看圖軟件 1.Windows照片 2.Honeyview 3.EzViewer 4.XnView MP 5.JPEGView 6.Irfan View 二、綜合型文件查看 1.Quicklook 2.愛奇藝萬能聯播 3.WPS圖片 4.谷歌瀏覽器 一、專業型看圖軟件 1.Windows照片 Windows自帶的照片應用就是一款比較強大的看圖軟件&#xf…

機器學習的簡單邏輯回歸的Advanced Optimization

Learning Course: One variable logistic regression optimization 單變量&#xff08;只有一個特征&#xff09;的用于分類的邏輯回歸的cost function的最小值求解, here: x[x1;x2]; y{0,1}; theta[theta(1);theta(2)] 由于分類中的y值需為0-1之間的數值&#xff0c;因此這里的…

java float f1=0.5_Java Math類靜態float copySign(float f1,float f2)與示例

數學類float copySign(float f1&#xff0c;float f2)此方法在java.lang包中可用。此方法用于返回第一個浮點參數以及第二個浮點參數的符號。這是一個靜態方法&#xff0c;因此也可以使用類名進行訪問。在此方法中&#xff0c;我們傳遞了兩個參數作為參數&#xff1a;第一個參數…

Sentinel介紹與使用

一、Sentinel簡介 Sentinel是阿里開源的項目&#xff0c;提供了流量控制、熔斷降級、系統負載保護等多個維度來保障服務之間的穩定性。 二&#xff1a;Sentinel 功能和設計理念 流量控制 流量控制在網絡傳輸中是一個常用的概念&#xff0c;它用于調整網絡包的發送數據。然而…

電腦知識:BIOS和UEFI的對比介紹

??作者主頁&#xff1a;IT技術分享社區 ??作者簡介&#xff1a;大家好,我是IT技術分享社區的博主&#xff0c;從事C#、Java開發九年&#xff0c;對數據庫、C#、Java、前端、運維、電腦技巧等經驗豐富。 ??個人榮譽&#xff1a; 數據庫領域優質創作者&#x1f3c6;&#x…

緩存更新的套路

看到好些人在寫更新緩存數據代碼時&#xff0c;先刪除緩存&#xff0c;然后再更新數據庫&#xff0c;而后續的操作會把數據再裝載的緩存中。然而&#xff0c;這個是邏輯是錯誤的。試想&#xff0c;兩個并發操作&#xff0c;一個是更新操作&#xff0c;另一個是查詢操作&#xf…

怎樣獲取當前頁面值php,想要得到當前頁面的所有url參數信息怎么用PHP來實現?...

本篇文章主要給大家介紹怎么使用php獲取完整url。首先給新手小白們簡單介紹下什么是url。百度百科上是這么解說的&#xff0c;統一資源定位符是對可以從互聯網上得到的資源的位置和訪問方法的一種簡潔的表示&#xff0c;是互聯網上標準資源的地址。互聯網上的每個文件都有一個唯…

@PostConstruct注解學習,最詳細的分享教程

該注解可以實現在運行工程時&#xff0c;自動運行該注解下的方法&#xff1b; PostConstruct是java自帶的注解&#xff0c;指的是在項目啟動的時候執行這個方法&#xff0c;也可以理解為在spring容器啟動的時候執行&#xff0c;可作為一些數據的常規化加載&#xff0c;比如數據…

電腦知識:分享實用的電腦維護小常識

目錄 常識1&#xff1a;杜絕直接拔電腦電源強行關機 常識2&#xff1a;不要用電池玩游戲 常識3&#xff1a;開不了機可以嘗試插拔內存條 常識4&#xff1a;電腦散熱的處理方法 常識5&#xff1a;避免在電腦工作時拔插頭 今天小編就為大家帶來一些電腦日常實用中的維護小知識&am…

Sentinel實現黑白名單控制詳細教程來了

一&#xff1a;新建一個IpRequestOriginParser類&#xff0c;實現RequestOriginParser接口&#xff0c;配置如下 public class IpRequestOriginParser implements RequestOriginParser {/*** Parse the origin from given HTTP request.** param request HTTP request* return …

php獲取服務器名稱,PHP 獲取服務器詳細信息

獲取系統類型及版本號&#xff1a; php_uname() (例&#xff1a;Windows NT COMPUTER 5.1 build 2600)只獲取系統類型&#xff1a; php_uname(s) (或&#xff1a;PHP_OS&#xff0c;例&#xff1a;Windows NT)只獲取系統版本號&#xff1a; php_u…

D. Anton and Chess 模擬題 + 讀題

http://codeforces.com/contest/734/problem/D 一開始的時候看不懂題目&#xff0c;以為象是中國象棋那樣走&#xff0c;然后看不懂樣例。 原來是走對角線的&#xff0c;長知識了。 所以我們就知道&#xff0c;王有八個方向&#xff0c;所以每個方向選一個來做代表就行了。 那么…

電腦知識:常見電腦藍屏代碼識別與處理方法

電腦藍屏怎么辦&#xff1f; 相信大家都遇到過藍屏的問題&#xff0c; 有時候電腦用著用著就突然藍屏了&#xff0c; 或者某天開機突然藍屏了…… 電腦藍屏的原因非常的多&#xff0c; 到底是什么引起的呢&#xff1f; 收集了一些最常見的幾種藍屏代碼&#xff0c; 大家只需要如…

sentinel的@SentinelResource注解使用

客戶自定義限流處理邏輯 創建ExceptionUtil類用于自定義限流處理邏輯 自定義限流處理類: ExceptionUtil 二&#xff1a;新增 SentinelResource注解 配置 SentinelResource(value “hello2”, blockHandler “exHandler”, blockHandlerClass {ExceptionUtil.class}) 通過…

PHP寫猜數字,PHP算法之猜數字

小A 和 小B 在玩猜數字。小B 每次從 1, 2, 3 中隨機選擇一個&#xff0c;小A 每次也從 1, 2, 3 中選擇一個猜。他們一共進行三次這個游戲&#xff0c;請返回 小A 猜對了幾次&#xff1f;輸入的guess數組為 小A 每次的猜測&#xff0c;answer數組為 小B 每次的選擇。guess和answ…

總結一年來的前端學習心得

到今天&#xff0c;前端學習剛好滿一年。我也順利從非計算機專業轉到前端。對于前端學習&#xff0c;自己也是摸著石頭過河&#xff0c;中間也有過困惑和迷茫。本文主要講述自己一年來對于前端學習的心得體會&#xff0c;希望能對學習前端的人提供一些幫助。 前端主要分為三部分…

辦公技巧:10個WORD神操作,值得收藏

目錄 1、F4鍵 2、Ctrl字母快捷鍵 3、巧用“文檔比較” 4、巧用替換功能 5、特殊字體保存 6、Word表格隨心粘 7、去除超鏈接 8、Word圖片輕松移 9、截圖 10、格式刷不停 在日常辦公當中&#xff0c; Word文檔就是我們最常用的軟件之一。用它我們寫論文、寫方案、寫小說等等。 但…

MYSQL學習:GROUP BY分組取最新的一條記錄

日常開發當中&#xff0c;經常會遇到查詢分組數據中最新的一條記錄&#xff0c;比如統計當前系統每個人的最新登錄記錄、外賣系統統計所有買家最新的一次訂單記錄、圖書管理系統借閱者最新借閱書籍的記錄等等。今天給大家介紹一下如何實現以上場景的SQL寫法&#xff0c;希望對大…

@SentinelResource注解實現熱點限流

下圖中請求url中param參數為axb&#xff0c;如果QPS超過5&#xff0c;就會限流 一&#xff1a;如下代碼 RestController public class ParamController {GetMapping("/param")SentinelResource(value "param", blockHandler "exHandler")p…