Mybatis | Mybatis 一级缓存、二级缓存、三级自定义缓存(Redis)
Mybatis 一級緩存、二級緩存、三級自定義緩存Redis實現
- 一、Mybatis 緩存
- 二、一級緩存 SqlSession級別
- 1.如何開啟一級緩存
- 2.什么時候清除緩存?
- 3.什么時候緩存失效?
- 4.存在的問題
- 5.查詢 加事務與不加事務
- 三、二級緩存 Mapper級別
- 1.開啟二級緩存
- 2.緩存清除
- 3.存在的問題
- 四、三級緩存 第三方自定義緩存(這里用Redis實現)
- 1.使用 Mybatis整合Redis實現分布式緩存
- 五、總結
一、Mybatis 緩存
Mybatis為什么要有緩存?
???????Mybatis 提供緩存當然是為了減少了與SQL數據庫的I/O交互, 提升查詢效率。
???????在Mybatis中存在兩種緩存,一級緩存與二級緩存。下面我們說說一級緩存與二緩存
二、一級緩存 SqlSession級別
Mybaits 中一級緩存也就做本地緩存,一級緩存是在會話也就是SqlSession層面實現的,一級緩存的作用范圍是在同一個SqlSession中,不同的SqlSession及時查詢相同的數據也不會走緩存。
1.如何開啟一級緩存
???????一級緩存是默認開啟的, 需要開啟事務。不加事務每次查詢都會創建SqlSession.
2.什么時候清除緩存?
- 當執行增刪改方法時會清除緩存。
- MyBatis全局配置屬性localCacheScope配置為Statement時,那么完成一次查詢就會清除緩存。
- 是否配置了flushCache=true屬性,如果配置了則會清除一級緩存。
3.什么時候緩存失效?
- SqlSession 需要開啟事務才會生效。否則每次查詢都壞創建一個新的SqlSession
- 不同的SqlSession 對應不同的緩存
- 同一個 SqlSession 查詢條件不同 也會不走緩存。
- 手動清空緩存,調用SqlSession clearCache()方法。
4.存在的問題
???????在同一個SqlSession中 兩次相同條件查詢中,第一次查詢后 然后手動修改表數據或者另一個SqlSession對象修改了數據庫或者分布式情況下數據發生了修改 那么第二次查詢是直接走緩存,查詢結果依舊相同,會存在數據不一致問題。
5.查詢 加事務與不加事務
加事務 只創建了一次SqlSession
不加事務 創建了兩次
三、二級緩存 Mapper級別
Mybatis 二級緩存是mapper級別的 需要手動開啟,他的作用范圍更廣也就是mapper文件的一個命名空間(namespace)中。
1.開啟二級緩存
二級緩存需要手動開啟
2.緩存清除
- 當執行增刪改方法時會清除緩存。
3.存在的問題
??????? 二級緩存也存在同一級緩存一樣的問題,只不過二級緩存的作用域比一級緩存大,
在同一個命名空間(namespace)中 兩次相同條件查詢中,第一次查詢后 然后手動修改表數據或者分布式情況下數據發生了修改 那么再次查詢是直接走緩存,查詢結果依舊相同,會存在數據不一致問題。
四、三級緩存 第三方自定義緩存(這里用Redis實現)
Mybatis 的一級緩存與二級緩存 只適用于單體項目,在分布式服務或者微服務架構下 都會出現數據不一致問題。所以Mybatis 為我們提供了自定義緩存 我們可以集成很多三方中間件來做緩存 這里就那Redis來說一下。
1.使用 Mybatis整合Redis實現分布式緩存
五、總結
MyBatis 的一級緩存 二級緩存 都不建議使用,它們只適用于單體項目,現在基本都是分布式或者微服務 框架使用的話會存在數據不一致問題。
在我開發這幾年,用的都是微服務架構。也沒用過Mybatis 的緩存 都是手動在代碼中做的redis 緩存。手動在代碼中做redis緩存我覺得更靈活。
總結
以上是生活随笔為你收集整理的Mybatis | Mybatis 一级缓存、二级缓存、三级自定义缓存(Redis)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: VMware vSphere ESX 4
- 下一篇: 【云原生 | Docker 高级篇】03