淺談Mybatis二級緩存的缺陷

一級緩存默認是開啟的(但是整合瞭Spring,Mybatis的一級緩存默認就失效瞭)

二級緩存是要手動配置開啟的(二級緩存是mapper級別的緩存,可以跨SqlSession)

Mybatis二級緩存

開啟二級緩存(xml方式):在*Mapper.xml中加入如下代碼

<!--eviction: 清空緩存的策略
    readOnly: 是否隻讀
    flushInterval: 每個60秒刷新一次緩存
    size: 內存大小,最多存儲結果對象或者列表的512個引用 -->
<cache readOnly="true" eviction="FIFO" flushInterval="60000" size="512"/>

緩存清除策略

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

兩種方式二選一,如果都配置會報錯:Caches collection already contains value for com.lixianhe.dao.UserMapper

註意:使用Mybatis二級緩存必須是xml寫SQL語句,不能使用註解寫SQL語句

緩存的執行順序

  • 先從二級緩存中查詢,二級緩存沒有進入SqlSession中查詢
  • SqlSession沒有就去數據庫查詢,然後存到一級緩存中,查詢完關閉SqlSession
  • 一級緩存再提交給二級緩存

在開啟二級緩存的情況下執行一條sql

select colA1, colA2, colB1, colB2 
from A, B 
where ...

A表執行瞭上述的sql
B表更新瞭字段cloB1,colB2
A表再次執行瞭上述的sql(前提沒有執行insert、update、delete)
A表第二次就查詢出瞭臟數據(B表的數據就是臟數據),這個問題對二級緩存來說是一個無解的問題

因此Mybatis二級緩存的使用用一個前提,必須保證所有的增刪改查都在同一個namespace下才行

由於二級緩存的弊端,所以並不建議在實際生產中使用,而是在外部實現自己的緩存,如使用Redis做緩存

到此這篇關於淺談Mybatis二級緩存的缺陷的文章就介紹到這瞭,更多相關Mybatis二級緩存內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!

推薦閱讀: