Mybatis之一級緩存與二級緩存

前言

面試官:蟲蟲你簡歷上寫了瞭解mybatis緩存,那你能說說一級緩存和二級緩存的區別嗎?面試

蟲蟲:我只知道這是用來緩存sql查詢的數據sql

面試官:沒了?數據庫

蟲蟲:沒了緩存

面試官:公司門知道在哪裏吧 本身走仍是我送你session

以上是蟲蟲的面試經歷 因而蟲蟲決定惡補一下Mybatis緩存機制的知識imagemybatis

Mybatis的緩存,包括一級緩存和二級緩存

Mybatis對緩存提供支持,一級緩存是默認使用的app

二級緩存須要手動開啓性能

區別:一級緩存的做用域是一個sqlsession內;二級緩存做用域是針對mapper進行緩存.測試

一級緩存:

在參數和SQL徹底同樣的狀況下,咱們使用同一個SqlSession對象調用一個Mapper方法,每每只執行一次SQL,由於使用SelSession第一次查詢後,MyBatis會將其放在緩存中,之後再查詢的時候,若是沒有聲明須要刷新,而且緩存沒有超時的狀況下,SqlSession都會取出當前緩存的數據,而不會再次發送SQL到數據庫。spa

image

一級緩存時執行commit,close,增刪改等操做,就會清空當前的一級緩存;當對SqlSession執行更新操做(update、delete、insert)後並執行commit時,不只清空其自身的一級緩存(執行更新操做的效果),也清空二級緩存(執行commit()的效果)。

二級緩存:

二級緩存指的就是同一個namespace下的mapper,二級緩存中,也有一個map結構,這個區域就是一級緩存區域。一級緩存中的key是由sql語句、條件、statement等信息組成一個惟一值。一級緩存中的value,就是查詢出的結果對象。
image

一、在配置文件中 開啓二級緩存的總開關

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

二、 在mapper映射文件中開啓二級緩存

<cache eviction="FIFO" flushInterval="60000" size="512" 
readOnly="true"/>
參數名 屬性
eviction 收回策略
flushInterval 刷新間隔
size 引用數目
readOnly 只讀
關於eviction的各個參數屬性:
參數名 屬性
eviction="LRU" 最近最少使用的:移除最長時間不被使用的對象。 (默認)
eviction="FIFO" 先進先出:按對象進入緩存的順序來移除它們。
eviction="SOFT" 軟引用:移除基於垃圾回收器狀態和軟引用規則的對象。
eviction="WEAK" 弱引用:更積極地移除基於垃圾收集器狀態和弱引用規則的對象。

三、實體類實現Serializable

禁用緩存

如測試sql語句性能時緩存會影響測試準確性 須要禁用
在映射文件中:
默認值是true useCache=」false」

<select id="findAllPets" resultMap="petsMap" useCache="false">
 select * from pets
</select>

刷新緩存

在映射文件中:
屬性:flushCache=」true」
刷新緩存,在查詢語句中,默認值是false,在新增刪除修改語句中,默認值是true(清空緩存)
image

要是能爲您提供幫助,請給予支持(關注、點贊、分享),蟲蟲蟹蟹你們了!

相關文章
相關標籤/搜索