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