1. 程式人生 > >我對MyBatis的快取機制的理解

我對MyBatis的快取機制的理解

MyBatis的快取機制是基於ID進行快取的,也就是說,MyBatis使用HashMap快取資料時,是使用物件的ID作為key,而物件作為value儲存的。

MyBatis的查詢快取分為一級快取和二級快取。

一級快取是SqlSession級別的快取,二級快取是mapper級別的快取。

1、一級快取(SqlSession,MyBatis預設開啟一級快取,不需要進行任何配置)

在操作資料庫時需要構造SqlSession物件,在物件中有一個HashMap用於儲存快取資料。不同的SqlSession之間的快取資料區域是互相不影響的。

一級快取的作用域是SqlSession範圍的,當在同一個sqlSession中執行兩次相同的sql語句時,第一次執行完畢會將資料庫中查詢的資料寫到快取(記憶體),

第二次查詢時會從快取中獲取資料,不再去底層資料庫查詢,從而提高查詢效率。

需要注意的是,如果SqlSession執行了DML操作(增刪改),並且提交到資料庫,MyBatis則會清空SqlSession中的一級快取,這樣做的目的是為了保證快取中儲存的是最新的資訊,避免出現髒讀現象。

當一個SqlSession結束後該SqlSession中的一級快取也就不存在了。

關閉一級快取後,再次訪問,需要再次獲取一級快取,然後才能查詢資料,否則會丟擲異常。

2、二級快取(mapper ,MyBais預設沒有開啟二級快取,需要在setting全域性引數中配置開啟二級快取)

二級快取是mapper級別的快取。使用二級快取時,多個SqlSession使用同一個Mapper的sql語句去操作資料庫,得到的資料會存在二級快取區域,它同樣是使用HashMap進行資料儲存。相比一級快取SqlSession,二級快取的範圍更大,多個Sqlsession可以共用二級快取,二級快取是跨SqlSession的。

二級快取的作用域是mapper的同一個namespace。不同的sqlSession兩次執行相同的namespace下的sql語句,且向sql中傳遞的引數也相同,即最終執行相同的sql語句,則第一次執行完畢會將資料庫中查詢的資料寫到快取,第二次查詢會從快取中獲取資料,不再去底層資料庫查詢,從而提高效率。

在MyBatis配置檔案(mybatis-config.xml)中開啟二級快取

<settings>

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

</settings>

//value屬性預設為false

在**Mapper.xml中開啟當前mapper的namespace下的二級快取

<cache evicition="LRU" flushInterval="60000" size="512" readOnly="true"/>代表建立了一個LRU快取,並每隔60秒重新整理,最大儲存512個物件,而且返回的物件被認為是隻讀的。

evicition收回策略,預設是LRU

(1)LRU最近最少使用策略,一處做長時間不被使用的物件。

(2)FIFO先進先出策略,按物件進入快取的順序來移除它們。

(3)SOFT軟引用策略,移除基於垃圾回收器狀態和軟引用規則的物件。

(4)WEAK弱引用策略,更積極地移除基於垃圾收集器狀態和弱引用規則的物件。

相關推薦

MyBatis快取機制理解

MyBatis的快取機制是基於ID進行快取的,也就是說,MyBatis使用HashMap快取資料時,是使用物件的ID作為key,而物件作為value儲存的。 MyBatis的查詢快取分為一級快取和二級快取。 一級快取是SqlSession級別的快取,二級快取是mapper級

《深入理解mybatis原理》 MyBatis快取機制的設計與實現

本文主要講解MyBatis非常棒的快取機制的設計原理,給讀者們介紹一下MyBatis的快取機制的輪廓,然後會分別針對快取機制中的方方面面展開討論。 MyBatis將資料快取設計成兩級結構,分為一級快取、二級快取:       &nb

解構委托、事件--他們本質的理解

remove 類型 實例化 如果 方法 擴展 調用 所有 csharp 一、委托 1、因為委托是一個特殊的類,所以定義委托和定義類一樣,可以在命名空間下定義; namespace _06委托的理解 { public delegate void MyDelege

也談談Docker的簡單理解

linux 安全性 看到了 用戶 總結 們的 部分 占用 ont Docker能解決什麽問題呢?一個工具的出現必然需要解決一些問題,Docker也不例外,簡單說說我們常見的2種情況Docker是如何解決的吧。1、程序在我這跑得好好的,在你那怎麽就不行呢?!這是一個典型的應用

談談Spring IOC的理解

反轉 頻率 註解 改變 enc encoding 圖1 1.3 ram 轉自京東開濤大神的微博,這是我看過最好的對IOC DI的解釋. 學習過Spring框架的人一定都會聽過Spring的IoC(控制反轉) 、DI(依賴註入)這兩個概念,對於初學Spring的人來說,總

談談多態的理解

哪些 extends 對象 構造方法 bsp 自己的 ext 調用 根據 舉例: 父類:Person{}   子類:Child extends Person{} 父類的引用指向子類的對象:Person p = new Child(); 理解:在編譯期認為p是父類的對象,在運

談談區塊鏈的理解(基礎篇)

希望 總決賽 意思 效果 理由 合約 又是 安全 價值       最近,區塊鏈技術成為每個人耳渲目染的話題,甚至被一些人認為可以顛覆整個社會,可能是由於比特幣的大漲,也有可能是因為國家政策的出行,各個國家都在為區塊鏈招兵買馬

再談韋伯/費希納定律以及數學公式的理解

浙江溫州皮鞋溼,下雨進水不會胖! 今年年初的時候,我寫過一篇關於費希納定律的文章,當時也算是即興寫作,記得本來是看了個電影,電影到高潮的時候喝了一瓶真露看到結束,然後有點微暈,就寫了那篇文章: 韋伯-費希納定律與對數關係的深意 :https://blog.csdn.net/dog250/

談談多型的理解

什麼是多型 多型是面向物件的特性之一,從字面上理解,多型就是指一個物件在執行是會有多種形態,就比如可以說student是一個person,也可以說student是一個object。 我們來看一個經典的例子: Service service=new ServiceImpl(); 我們經

分享知識-快樂自己:Mybatis快取機制

論快取機制: 1):mybatis 提供了快取機制減輕資料庫壓力,提高資料庫效能。 2):mybatis 的快取分為兩級:一級快取、二級快取 3):一級快取是SqlSession級別的快取,快取的資料只在SqlSession內有效。 4):二級快取是mapper級別的快取,同一個

Mybatis 快取機制

快取 查詢快取主要是為了提高查詢訪問速度,即當用戶執行一次查詢後,會將該資料結果放到快取中,當下次再執行此查詢時就不會訪問資料庫了而是直接從快取中獲取該資料。 如果在快取中找到了資料那叫做命中。 一級快取 MyBatis的一級查詢快取(也叫作本地快取)是基於org.ap

設計模式的理解

最近在看一本叫做《大話設計模式》的書,感覺本書的作者是下了功夫了,寫的不錯,通俗易懂而且表達很直接很明確,跟之前讀過的幾本書感覺不太一樣,之前讀的幾本書作者彎彎繞繞,最後也不知道到底想說什麼。 為了更好的鞏固自己學到的東西,也為了是自己能堅持讀完這

mybatis快取機制詳解

mybatis提供了快取機制減輕資料庫壓力,提高資料庫效能 mybatis的快取分為兩級:一級快取、二級快取 一級快取是SqlSession級別的快取,快取的資料只在SqlSession內有效(快取資料為執行緒私有) 二級快取是mapper級別的快取,同一個name

MyBatis 快取機制-【009】

開啟二級快取配置:<setting name=“chcheEnabled” value=“true”>(value=false關閉二級快取,不會關閉一級快取。) 去mapper.xml中配置使用二級快取:<cache></cache> POJO需要實現序列化介面 每個se

Mybatis快取機制mybatis的各個組成部分

  Mybatis    一級快取: 基於PerpetualCache 的 HashMap本地快取,其儲存作用域為 Session,當 Session flush 或 close 之後,該Session中的所有 Cache 就將清空。    2. 二級快取與一級快取其機制相同,預設也是採用 Perpetual

Restful風格的理解

平常使用增刪改查的時候 一般情況都是用這幾個   比如  addStuInfo  deleteStuInfo  UpadteStuinfo。。。。。 我感覺這樣是不安全的...如果沒有上一步操作的情況下,直接輸入這個網址,就直接把這條資料刪掉了 這時候我發現了Res

淺談spring框架的理解

    總所周知,java界乃由五大傳統框架:1.核心業務層框架(地位不可動搖)spring,2.控制層框架:spring MVC與struts2, 持久層框架:Mybatis,hibernate。    先從spring說起吧,瞭解過spring的同學都知道,spring的

記錄下加密傳輸的理解

很多網站在傳輸過程中需要做到加密傳輸,為了防止資訊被洩露不能明文傳輸。有2種方式可以對傳輸資料進行加密:1、採用https方式傳輸,這樣就可以不用在程式碼裡面做資料的加解密處理了。但是有時候為了安全性更高還會再使用安全控制元件。2、對稱加密+非對稱加密:(1)首先採用非對稱加

敏捷開發實踐(一)--談談敏捷開發的理解

隨著敏捷開發越來越流行,人人都在談敏捷,人人也都在學習scrum等敏捷開發方法。。。當然,自己也是敏捷開發的實施者和受益者。 背景 我們公司引入敏捷開發的時間並不長,在實施敏捷的過程還存在一些問題,自己在實施敏捷的過程也存在很多的疑惑(畢竟原來沒有學過,

10007---敏捷開發實踐(一)--談談敏捷開發的理解

原文 隨著敏捷開發越來越流行,人人都在談敏捷,人人也都在學習scrum等敏捷開發方法。。。當然,自己也是敏捷開發的實施者和受益者。 背景 我們公司引入敏捷開發的時間並不長,在實施敏捷的過程還存在一些問題,自己在實施敏捷的過程也存在很多的疑惑(畢竟原來沒有學過,和真實