一文搞懂Mybatis緩存,最新最全

Mybatis緩存

MyBatis 包含一個非常強大的查詢緩存特性,它可以非常方便地配置和定製。緩存可以極大的提升查詢效率。
  MyBatis系統中默認定義了兩級緩存。一級緩存和二級緩存。

  1. 默認情況下,只有一級緩存(SqlSession級別的緩存,也稱爲本地緩存)開啓。
  2. 二級緩存需要手動開啓和配置,他是基於namespace級別的緩存。
  3. 爲了提高擴展性。MyBatis定義了緩存接口Cache。我們可以通過實現Cache接口來自定義二級緩存。

1.一級緩存

一級緩存:(本地緩存):sqlSession級別的緩存。一級緩存是一直開啓的;本質上是SqlSession級別的一個Map。與數據庫同一次會話期間查詢到的數據會放在本地緩存中。以後如果需要獲取相同的數據,直接從緩存中拿,沒必要再去查詢數據庫。
 一級緩存失效的四種情況:

  1. 使用不同的sqlsession
  2. sqlSession相同,查詢條件不同.(當前一級緩存中還沒有這個數據)
  3. sqlSession相同,兩次查詢之間執行了增刪改操作(這次增刪改可能對當前數據有影響)
  4. sqlSession相同,手動清除了一級緩存(緩存清空,調用sqlsession.clearCache()方法)

2.二級緩存

(全局緩存):基於namespace級別的緩存:一個namespace對應一個二級緩存。
工作機制:

  1. 一個會話,查詢一條數據,這個數據就會被放在當前會話的一級緩存中;
  2. 如果會話關閉;一級緩存中的數據會被保存到二級緩存中;新的會話查詢信息,就可以參照二級緩存中的內容;
  3. 不同namespace查出的數據會放在自己對應的緩存中(map)。也就是說不同的mapper都有自己對應的二級緩存,查詢出的數據會被放到自己對應的二級緩存中。
    注意:查出的數據都會被默認先放在一級緩存中。只有會話提交或者關閉以後,一級緩存中的數據纔會轉移到二級緩存中.

二級緩存使用步驟

  1. 開啓全局二級緩存配置:<setting name="cacheEnabled" value="true"/>
  2. 去mapper.xml中配置使用二級緩存:<cache></cache>
  3. 我們的POJO需要實現序列化接口。

3.緩存相關屬性/設置

3.1 cache標籤的屬性

<cache eviction="FIFO" flushInterval="60000" readOnly="false" size="1024"></cache>
1. eviction:緩存的回收策略:

  • LRU – 最近最少使用的:移除最長時間不被使用的對象。
  • FIFO – 先進先出:按對象進入緩存的順序來移除它們。
  • SOFT – 軟引用:移除基於垃圾回收器狀態和軟引用規則的對象。
  • WEAK – 弱引用:更積極地移除基於垃圾收集器狀態和弱引用規則的對象。
  • 默認的是 LRU

2. flushInterval:緩存刷新間隔
  緩存多長時間清空一次,默認不清空,設置一個毫秒值。默認情況下,執行update、select、insert語句的時候會情況緩存。
3. readOnly:是否只讀:
  true:只讀;mybatis認爲所有從緩存中獲取數據的操作都是隻讀操作,不會修改數據。mybatis爲了加快獲取速度,直接就會將數據在緩存中的引用交給用戶。不安全,速度快。
  false:非只讀:mybatis覺得獲取的數據可能會被修改。mybatis會利用序列化&反序列的技術克隆一份新的數據給你。安全,速度慢。
4. size:緩存存放多少元素;
5. type="":指定自定義緩存的全類名;實現Cache接口即可;

3.2 緩存有關設置

  1. 全局setting的cacheEnable:關閉緩存(二級緩存關閉)(一級緩存一直可用的)
  2. 每個select標籤都有useCache=“true”:如果值爲false:不使用緩存(一級緩存依然使用,二級緩存不使用)
  3. 每個增刪改標籤的:flushCache=“true”:(一級二級都會清除)。也就是說增刪改執行完成後就會清除緩存,一級和二級緩存都會被清除。
  4. 查詢標籤:flushCache=“false”:如果flushCache=true;每次查詢之後都會清除緩存。
  5. sqlSession.clearCache();只是清楚當前session的一級緩存;
  6. localCacheScope:本地緩存作用域:(默認值是SESSION,表示當前會話的所有數據保存在會話緩存中);如果值爲STATEMENT:表示禁用一級緩存(基本不使用)。

4.Mybatis緩存原理圖示

緩存原理圖示

  1. 每一個sqlsession都有自己對應的一級緩存,一個系統中會存在多個sqlsession。即使是查找相同的數據(例如1-emp),都會從自己的一級緩存中查找,而不會查找到其他的sqlsession的一級緩存中;
  2. 二級緩存的範圍更大,它是以namespace爲級別。每一個namespace有自己對應的二級緩存區域。(其實就是不同的mapper有自己對應的二級緩存);
  3. 一級緩存中的數據,只有當會話關閉或者提交的時候纔會被保存在二級緩存中;
  4. 當執行一條sql查詢語句時,會先從二級緩存中查詢,如果沒有找到,會從一級緩存中查詢,如果還是沒有找到,就會去數據庫中查詢。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章