日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

Mybatis | Mybatis 一级缓存、二级缓存、三级自定义缓存(Redis)

發(fā)布時間:2024/1/18 数据库 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Mybatis | Mybatis 一级缓存、二级缓存、三级自定义缓存(Redis) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

Mybatis 一級緩存、二級緩存、三級自定義緩存Redis實(shí)現(xiàn)

  • 一、Mybatis 緩存
  • 二、一級緩存 SqlSession級別
    • 1.如何開啟一級緩存
    • 2.什么時候清除緩存?
    • 3.什么時候緩存失效?
    • 4.存在的問題
    • 5.查詢 加事務(wù)與不加事務(wù)
  • 三、二級緩存 Mapper級別
    • 1.開啟二級緩存
    • 2.緩存清除
    • 3.存在的問題
  • 四、三級緩存 第三方自定義緩存(這里用Redis實(shí)現(xiàn))
    • 1.使用 Mybatis整合Redis實(shí)現(xiàn)分布式緩存
  • 五、總結(jié)

一、Mybatis 緩存

Mybatis為什么要有緩存?

???????Mybatis 提供緩存當(dāng)然是為了減少了與SQL數(shù)據(jù)庫的I/O交互, 提升查詢效率。
???????在Mybatis中存在兩種緩存,一級緩存與二級緩存。下面我們說說一級緩存與二緩存

二、一級緩存 SqlSession級別

Mybaits 中一級緩存也就做本地緩存,一級緩存是在會話也就是SqlSession層面實(shí)現(xiàn)的,一級緩存的作用范圍是在同一個SqlSession中,不同的SqlSession及時查詢相同的數(shù)據(jù)也不會走緩存。

1.如何開啟一級緩存

???????一級緩存是默認(rèn)開啟的, 需要開啟事務(wù)。不加事務(wù)每次查詢都會創(chuàng)建SqlSession.

2.什么時候清除緩存?

  • 當(dāng)執(zhí)行增刪改方法時會清除緩存。
  • MyBatis全局配置屬性localCacheScope配置為Statement時,那么完成一次查詢就會清除緩存。
  • 是否配置了flushCache=true屬性,如果配置了則會清除一級緩存。

3.什么時候緩存失效?

  • SqlSession 需要開啟事務(wù)才會生效。否則每次查詢都壞創(chuàng)建一個新的SqlSession
  • 不同的SqlSession 對應(yīng)不同的緩存
  • 同一個 SqlSession 查詢條件不同 也會不走緩存。
  • 手動清空緩存,調(diào)用SqlSession clearCache()方法。

4.存在的問題

???????在同一個SqlSession中 兩次相同條件查詢中,第一次查詢后 然后手動修改表數(shù)據(jù)或者另一個SqlSession對象修改了數(shù)據(jù)庫或者分布式情況下數(shù)據(jù)發(fā)生了修改 那么第二次查詢是直接走緩存,查詢結(jié)果依舊相同,會存在數(shù)據(jù)不一致問題。


5.查詢 加事務(wù)與不加事務(wù)

加事務(wù) 只創(chuàng)建了一次SqlSession


不加事務(wù) 創(chuàng)建了兩次

三、二級緩存 Mapper級別

Mybatis 二級緩存是mapper級別的 需要手動開啟,他的作用范圍更廣也就是mapper文件的一個命名空間(namespace)中。

1.開啟二級緩存

二級緩存需要手動開啟

  • application.properties 中配置
  • mybatis-plus.configuration.cache-enabled=true
  • 在mapper.xml文件中加入下邊配置 或者 使用注解SQL開發(fā)的話使用@CacheNamespace來開啟
  • <cache/> 或者 <cache-ref namespace="com.xxx.xxx.mapper.UserMapper"/>
  • 如果某個sql 不想走緩存的話 需要在像如下操作useCache=false
  • <select id="findLogs" resultType="map" useCache="false">
  • 查詢返回結(jié)果集需要實(shí)現(xiàn)序列化接口
  • 當(dāng)?shù)谝淮尾樵兪聞?wù)提交后, 才會真正的存取二級緩存中
  • 2.緩存清除

    • 當(dāng)執(zhí)行增刪改方法時會清除緩存。

    3.存在的問題

    ??????? 二級緩存也存在同一級緩存一樣的問題,只不過二級緩存的作用域比一級緩存大,

    在同一個命名空間(namespace)中 兩次相同條件查詢中,第一次查詢后 然后手動修改表數(shù)據(jù)或者分布式情況下數(shù)據(jù)發(fā)生了修改 那么再次查詢是直接走緩存,查詢結(jié)果依舊相同,會存在數(shù)據(jù)不一致問題。

    四、三級緩存 第三方自定義緩存(這里用Redis實(shí)現(xiàn))

    Mybatis 的一級緩存與二級緩存 只適用于單體項(xiàng)目,在分布式服務(wù)或者微服務(wù)架構(gòu)下 都會出現(xiàn)數(shù)據(jù)不一致問題。所以Mybatis 為我們提供了自定義緩存 我們可以集成很多三方中間件來做緩存 這里就那Redis來說一下。

    1.使用 Mybatis整合Redis實(shí)現(xiàn)分布式緩存

  • POM坐標(biāo)
  • <dependency><groupId>org.mybatis.caches</groupId><artifactId>mybatis-redis</artifactId><version>1.0.0-beta2</version></dependency>
  • application.properties 中配置
  • # 開啟緩存 mybatis-plus.configuration.cache-enabled=true##redis 配置 redis.host=localhost redis.port=6379 redis.connectionTimeout=5000 redis.password= redis.database=0
  • mapper.xml 文件中
  • <cache type="org.mybatis.caches.redis.RedisCache"/>

    五、總結(jié)

    MyBatis 的一級緩存 二級緩存 都不建議使用,它們只適用于單體項(xiàng)目,現(xiàn)在基本都是分布式或者微服務(wù) 框架使用的話會存在數(shù)據(jù)不一致問題。

    在我開發(fā)這幾年,用的都是微服務(wù)架構(gòu)。也沒用過Mybatis 的緩存 都是手動在代碼中做的redis 緩存。手動在代碼中做redis緩存我覺得更靈活。

    總結(jié)

    以上是生活随笔為你收集整理的Mybatis | Mybatis 一级缓存、二级缓存、三级自定义缓存(Redis)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。