精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

為什么不推薦使用 MyBatis 二級緩存

存儲 存儲架構
訂單表與會員表是存在一對多的關系,為了盡可能減少join查詢,進行了分階段查詢。即先查詢出訂單表,再根據??member_id??字段查詢出會員表,最后進行數據整合。而如果訂單表中存在重復的??member_id??,就會出現很多重復查詢。

為了增加查詢的性能,mybatis 提供了二級緩存架構,分為一級緩存和二級緩存。

這兩級緩存最大的區別就是:一級緩存是會話級別的,只要出了這個 SqlSession,緩存就沒用了。而二級緩存可以跨會話,多個會話可以使用相同的緩存!

一級緩存使用簡單,默認就開啟。二級緩存需要手動開啟,相對復雜,而且要注意的事項也多,否則可能有隱患。

一級緩存

應用場景

訂單表與會員表是存在一對多的關系,為了盡可能減少join查詢,進行了分階段查詢。即先查詢出訂單表,再根據member_id字段查詢出會員表,最后進行數據整合。而如果訂單表中存在重復的member_id,就會出現很多重復查詢。

針對這種情況,mybatis通過一級緩存來解決:在同一次查詢會話(SqlSession)中如果出現相同的語句及參數,就會從緩存中取出,不再走數據庫查詢。

一級緩存只能作用于查詢會話中,所以也叫做會話緩存。

生效的條件

一級緩存要生效,必須滿足以下條件條件:

  • 必須是相同的會話
  • 必須是同一個 mapper,即同一個 namespace
  • 必須是相同的 statement,即同一個 mapper 中的同一個方法
  • 必須是相同的 sql 和參數
  • 查詢語句中間沒有執行 session.clearCache() 方法
  • 查詢語句中間沒有執行 insert/update/delete 方法(無論變動記錄是否與緩存數據有無關系)

與springboot集成時一級緩存不生效原因

圖片圖片

因為一級緩存是會話級別的,要生效的話,必須要在同一個 SqlSession 中。但是與 springboot 集成的 mybatis,默認每次執行sql語句時,都會創建一個新的 SqlSession!所以一級緩存才沒有生效。

當調用 mapper 的方法時,最終會執行到 SqlSessionUtils 的 getSqlSession 方法,在這個方法中會嘗試在事務管理器中獲取 SqlSession,如果沒有開啟事務,那么就會 new 一個 DefaultSqlSession

圖片圖片

所以說,即便在同一個方法中,通過同一個 mapper 連續調用兩次相同的查詢方法,也不會觸發一級緩存。

解決與springboot集成時一級緩存不生效問題

在上面的代碼中也看到了,mybatis 在查詢時,會先從事務管理器中嘗試獲取 SqlSession,取不到才會去創建新的 SqlSession。所以可以猜測只要將方法開啟事務,那么一級緩存就會生效。

加上 @Transactional 注解,看下效果:

圖片圖片

沒錯,的確生效了。在代碼中可以看到,從事務管理器中,獲取到了 SqlSession:

圖片圖片

再看看源碼中是什么時候將 SqlSession 設置到事務管理器中的。

SqlSessionUtils 中,在獲取到 SqlSession 后,會調用 registerSessionHolder 方法注冊 SessionHolder 到事務管理器:

圖片圖片

具體是在 TransactionSynchronizationManager 的 bindResource 方法中操作的,將 SessionHolder 保存到線程本地變量(ThreadLocal) resources 中,這是每個線程獨享的。

圖片圖片

然后在下次查詢時,就可以從這里取出此 SqlSession,使用同一個 SqlSession 查詢,一級緩存就生效了。

所以基本原理就是:如果當前線程存在事物,并且存在相關會話,就從 ThreadLocal 中取出。如果沒有事務,就重新創建一個 SqlSession 并存儲到 ThreadLocal 當中,共下次查詢使用。

至于緩存查詢數據的地方,是在 BaseExecutor 中的 queryFromDatabase 方法中。執行 doQuery 從數據庫中查詢數據后,會立馬緩存到 localCache(PerpetualCache類型) 中:

圖片圖片

二級緩存

應用場景

業務系統中存在很多的靜態數據如,字典表、菜單表、權限表等,這些數據的特性是不會輕易修改但又是查詢的熱點數據。

一級緩存針對的是同一個會話當中相同SQL,并不適合這情熱點數據的緩存場景。

為了解決這個問題引入了二級緩存,它脫離于會話之外,多個會話可以使用相同的緩存。

看一個例子:

@RestController
@RequestMapping("item")
public class ItemController {

    @Autowired
    private ItemMapper itemMapper;

    @GetMapping("/{id}")
    public void getById(@PathVariable("id") Long id) {
        System.out.println("==================== begin ====================");
        Item item = itemMapper.selectById(id);
        System.out.println(JSON.toJSONString(item));
    }

}

當發送兩次 get 請求時(兩個不同的會話),通過日志可以發現第二次查詢使用的是緩存

圖片圖片

開啟的方法

二級緩存需要手動來開啟,mybatis 默認沒有開啟二級緩存。

1)在 yaml 中配置 cache-enabled 為 true

mybatis-plus:
  configuration:
    cache-enabled: true

2)Mapper 接口上添加 @CacheNamespace 注解

圖片圖片

3)實體類實現 Serializable 接口

圖片圖片

生效的條件

  • 當會話提交或關閉之后才會填充二級緩存
  • 必須是同一個 mapper,即同一個命名空間
  • 必須是相同的 statement,即同一個 mapper 中的同一個方法
  • 必須是相同的 SQL 語句和參數
  • 如果 readWrite=true(默認就是true),實體對像必須實現 Serializable 接口

緩存清除條件

  • 只有修改會話提交之后,才會執行清空操作
  • xml 中配置的 update 不能清空 @CacheNamespace 中的緩存數據
  • 任何一種增刪改操作都會清空整個 namespace 中的緩存

源碼中是如何填充二級緩存的?

在生效條件中提到了,二級緩存必須要在會話提交或關閉之后,才能生效!

在查詢到結果后,會調用 SqlSession 的 commit 方法進行提交(如果開啟事務的話,提交 SqlSession 走的不是這里了,但最終填充二級緩存的地方是一樣的。):

圖片圖片

在此方法中,最終會調用到 TransactionalCache 的 flushPendingEntries 方法中填充二級緩存:

圖片圖片

springboot 集成 mybatis 的話,如果沒有開啟事務,每次執行查詢,都會創建新的 SqlSession,所以即使是在同一個方法中進行查詢操作,那也是跨會話的。

查詢時如何使用二級緩存?

在查詢的時候,最終會調用 MybatisCachingExecutor 的 query 方法,里面會從 TransactionalCacheManager 中嘗試根據 key 獲取二級緩存的內容。

可以看到,這個 key 很長,由 mapper、調用的查詢方法、SQL 等信息拼接而成,這也是為什么想要二級緩存生效,必須滿足前面所說的條件。

如果能在二級緩存中查詢到,就直接返回了,不需要訪問數據庫。

圖片圖片

具體的調用層數實在太多,用到了裝飾者模式,最終是在 PerpetualCache 中獲取緩存的:

圖片圖片

打印日志是在 LoggingCache 中:

圖片圖片

為什么mybatis默認不開啟二級緩存?

答案就是,不推薦使用二級緩存!

二級緩存雖然能帶來一定的好處,但是有很大的隱藏危害!

它的緩存是以 namespace(mapper) 為單位的,不同 namespace 下的操作互不影響。且 insert/update/delete 操作會清空所在 namespace 下的全部緩存。

那么問題就出來了,假設現在有 ItemMapper 以及 XxxMapper,在 XxxMapper 中做了表關聯查詢,且做了二級緩存。此時在 ItemMapper 中將 item 信息給刪了,由于不同 namespace 下的操作互不影響,XxxMapper 的二級緩存不會變,那之后再次通過 XxxMapper 查詢的數據就不對了,非常危險。

來看一個例子:

@Mapper
@Repository
@CacheNamespace
public interface XxxMapper {

    @Select("select i.id itemId,i.name itemName,p.amount,p.unit_price unitPrice " +
            "from item i JOIN payment p on i.id = p.item_id where i.id = #{id}")
    List<PaymentVO> getPaymentVO(Long id);

}


@Autowired
private XxxMapper xxxMapper;

@Test
void test() {
 System.out.println("==================== 查詢PaymentVO ====================");
 List<PaymentVO> voList = xxxMapper.getPaymentVO(1L);
 System.out.println(JSON.toJSONString(voList.get(0)));
 System.out.println("====================  更新item表的name ==================== ");
 Item item = itemMapper.selectById(1);
 item.setName("java并發編程");
 itemMapper.updateById(item);
 System.out.println("====================  重新查詢PaymentVO ==================== ");
 List<PaymentVO> voList2 = xxxMapper.getPaymentVO(1L);
 System.out.println(JSON.toJSONString(voList2.get(0)));
}

上面的代碼,test()方法中前后兩次調用了 xxxMapper.getPaymentVO 方法,因為沒有加 @Transactional 注解,所以前后兩次查詢,是兩個不同的會話,第一次查詢完后,SqlSession 會自動 commit,所以二級緩存能夠生效;

然后在中間進行了 Item 表的更新操作,修改了下名稱;

由于 itemMapper 與 xxxMapper 不是同一個命名空間,所以 itemMapper 執行的更新操作不會影響到 xxxMapper 的二級緩存;

再次調用 xxxMapper.getPaymentVO,發現取出的值是走緩存的,itemName 還是老的。但實際上 itemName 在上面已經被改了!

執行日志如下:

圖片圖片

所以說,二級緩存的隱藏危害是比較大的,當有表關聯時,一個不注意就會出問題,不建議使用。

責任編輯:武曉燕 來源: 一安未來
相關推薦

2009-06-18 15:24:35

Hibernate二級

2009-09-21 14:59:31

Hibernate二級

2009-09-24 11:04:56

Hibernate二級

2013-09-08 23:30:56

EF Code Fir架構設計MVC架構設計

2023-04-27 08:18:10

MyBatis緩存存儲

2009-06-10 15:00:58

Hibernate二級配置

2009-09-21 14:39:40

Hibernate二級

2009-09-21 13:31:10

Hibernate 3

2009-09-23 09:37:07

Hibernate緩存

2019-08-21 14:34:41

2009-08-13 18:12:12

Hibernate 3

2024-12-03 14:38:07

CaffeineRedis二級緩存

2022-01-12 07:48:19

緩存Spring 循環

2022-03-01 18:03:06

Spring緩存循環依賴

2022-12-02 12:01:30

Spring緩存生命周期

2015-06-11 10:12:26

Android圖片加載緩存

2025-06-26 01:55:00

2024-11-29 08:20:22

Autowired場景項目

2022-10-20 18:00:00

MyBatis緩存類型

2024-11-12 10:30:54

Docker部署數據庫
點贊
收藏

51CTO技術棧公眾號

久久久精品福利| 91成人破解版| 成人影院在线视频| 久久久电影一区二区三区| 国产精品中文字幕在线| 九九热只有精品| 亚洲综合图色| 日韩欧美成人午夜| 国产男女激情视频| 日本精品600av| 久久久夜色精品亚洲| 91久久国产精品| 国产区一区二区三| 一区二区免费不卡在线| 亚洲精品网址在线观看| 香蕉视频xxx| 欧美色999| 午夜免费久久看| 天天干天天操天天干天天操| 日韩在线观看视频一区| 久久国产精品露脸对白| 57pao精品| 精国产品一区二区三区a片| 激情综合网五月| 亚洲精品www久久久久久广东| 在线播放av中文字幕| 午夜欧美巨大性欧美巨大| 午夜精品久久久久久久久久| 97超碰免费观看| 成人在线免费电影| 久久一区二区三区四区| 国产a一区二区| 国产黄a三级三级三级| 麻豆精品久久精品色综合| 欧美做受高潮电影o| 久久精品久久精品久久| 欧美在线网址| 久久亚洲精品网站| 欧美xxxx精品| 狠狠综合久久av一区二区蜜桃| 欧美精品一区二区在线播放 | 久久精品人人做人人爽电影蜜月| 欧美成人亚洲成人| 中文字幕亚洲欧美日韩| 手机亚洲手机国产手机日韩| 国产亚洲欧美视频| 亚洲色图第四色| 精品视频亚洲| 在线视频亚洲欧美| 国产欧美小视频| 波多野结衣一区| 中文字幕9999| 乱老熟女一区二区三区| 97视频热人人精品免费| 日韩在线观看免费网站| 蜜桃av免费观看| 91麻豆精品国产91久久久平台| 少妇激情综合网| 国精产品久拍自产在线网站| 五月精品视频| 欧美日韩ab片| 日韩乱码人妻无码中文字幕| 99xxxx成人网| 欧美又大又硬又粗bbbbb| 欧美特黄aaaaaa| 视频在线观看91| 国产精品视频白浆免费视频| 中文字幕在线观看欧美| 久久国产欧美日韩精品| 亚洲一区二区久久久久久| 国产成人精品免费看视频| 成人h动漫精品一区二区| 国产精成人品localhost| 亚洲三区在线观看无套内射| 久久久国产综合精品女国产盗摄| 视频一区二区三区在线观看| 国产视频在线播放| 亚洲第一激情av| 日本www高清视频| 亚洲视频自拍| 亚洲成人激情视频| 中文字幕免费视频| 亚洲精品a级片| 性金发美女69hd大尺寸| 色一情一乱一伦| 狠狠色综合日日| 好吊妞www.84com只有这里才有精品| 色哟哟在线观看| 国产精品国产自产拍在线| www.夜夜爱| 另类中文字幕国产精品| 日韩一区二区在线免费观看| 亚洲精品中文字幕在线播放| 清纯唯美综合亚洲| 欧美精品videosex牲欧美| 亚洲图片在线视频| 国产麻豆精品一区二区| 欧美日韩一区综合| 女子免费在线观看视频www| 色综合久久综合网| 极品人妻一区二区| 日韩在线观看一区| 午夜剧场成人观在线视频免费观看| 蜜臀尤物一区二区三区直播| 国产成人精品综合在线观看 | 一本之道在线视频| 国产亚洲一区| 久久青草精品视频免费观看| 中文字幕第2页| 9人人澡人人爽人人精品| 在线不卡日本| 日韩大片欧美大片| 精品99一区二区| 九九精品视频免费| 视频一区二区三区在线| 国产欧美在线一区二区| 国产激情在线| 欧美视频一区二| 精品人妻少妇嫩草av无码| 欧美在线播放| 成人在线国产精品| 国产高清av在线| 欧美日韩一区二区免费在线观看| 国偷自产av一区二区三区麻豆| 欧美先锋资源| 日本一区二区在线免费播放| 高清一区二区三区四区| 亚洲精品国产一区二区三区四区在线 | 欧美性色视频在线| 91丝袜在线观看| 国产精品久久| 亚洲精品免费av| 蜜桃视频在线观看www社区| 色婷婷久久久亚洲一区二区三区 | 欧美日韩一区二区三区在线电影 | 97久久精品一区二区三区的观看方式 | 五月天视频一区| 国产精品日日摸夜夜爽| 综合视频在线| 亚洲自拍小视频免费观看| 毛片在线看片| 欧美精品丝袜中出| 国产黄色录像片| 久久99热99| 亚洲午夜精品久久久久久浪潮| 欧美日韩大片| 亚洲人成电影网站色| 懂色av蜜臀av粉嫩av分享吧最新章节| caoporen国产精品视频| 国产午夜福利在线播放| 欧美18xxxx| 欧美在线激情视频| 奇米影视888狠狠狠777不卡| 色88888久久久久久影院野外| 一本色道综合久久欧美日韩精品| 亚洲欧美日韩国产一区二区| 欧美日韩在线观看一区二区三区| av在线不卡精品| www国产91| 精品久久无码中文字幕| 亚洲成人综合在线| 久久无码人妻精品一区二区三区 | 五月天开心婷婷| 中文字幕免费一区二区| 超碰97在线资源| 福利影院在线看| 亚洲天堂av在线免费观看| 男操女视频网站| 亚洲欧洲日本在线| 9191在线视频| 先锋a资源在线看亚洲| 香蕉久久夜色| 香蕉大人久久国产成人av| 欧美极品xxxx| 黄色片在线免费看| 欧美日韩成人综合在线一区二区| 九九热只有精品| 久久综合色天天久久综合图片| 色婷婷综合久久久久中文字幕| jiujiure精品视频播放| 91在线网站视频| 草草视频在线观看| 中文字幕亚洲一区二区三区五十路| 国产熟女精品视频| 婷婷六月综合网| 又色又爽的视频| gogo大胆日本视频一区| 午夜免费看毛片| 自拍偷拍99| 亚洲综合视频网站| 久久久青草婷婷精品综合日韩| 亚洲高清在线播放| 成人免费在线电影网| 国产成人自拍视频在线观看| av大片在线| 国产亚洲精品久久久久久牛牛| 精品人妻一区二区三区三区四区| 日韩欧美国产成人| 国产高潮流白浆| 久久久久久久久久久久久夜| 搡的我好爽在线观看免费视频| 午夜在线视频观看日韩17c| 中文字幕日韩精品久久| 亚洲理论电影片| 99精彩视频在线观看免费| 制服诱惑亚洲| 久久久久亚洲精品国产| 日本中文在线| 亚洲欧洲日产国产网站| 午夜久久久久久噜噜噜噜| 91高清视频在线| 黄色片视频网站| 亚洲精品中文在线影院| 日韩影视一区二区三区| 97国产一区二区| 美女流白浆视频| 国内成人免费视频| xxxx一级片| 久久久久久亚洲精品杨幂换脸| 屁屁影院ccyy国产第一页| 色琪琪久久se色| 欧美在线一二三区| 亚洲国产合集| 精品一区久久| 成人自拍在线| 99在线观看| 国产精品成人**免费视频| 国产精品久久久久久久久久久新郎 | 日本视频网站在线观看| 亚洲国产精品久久久久婷婷884| 男人操女人的视频网站| 国产精品视频一二三区| 日韩一级av毛片| 久久综合久久综合亚洲| 国产xxxxxxxxx| 丁香婷婷综合激情五月色| 免费人成视频在线播放| 国产一区二区三区黄视频| 色呦色呦色精品| 美女诱惑一区二区| 黄色片视频在线| 麻豆久久久久久久| 中文av一区二区三区| 免费久久精品视频| 三上悠亚在线一区二区| 美女www一区二区| 天天干天天综合| 九九**精品视频免费播放| 五月婷婷六月合| 久久99热国产| 中文字幕avav| 成人国产在线观看| 我和岳m愉情xxxⅹ视频| 久久久综合精品| 国产精品久久免费观看| 国产精品久久久久久亚洲伦| 日本裸体美女视频| 亚洲综合色自拍一区| 日韩精品视频免费看| 欧美午夜片在线免费观看| 日韩精品久久久久久免费| 欧美在线短视频| 91av久久久| 精品99久久久久久| 色网站在线免费观看| 在线成人一区二区| 国产精品久久久久久福利| 欧美黄色三级网站| 美女在线视频免费| 国产精品影院在线观看| 日韩在线亚洲| 久久精品国产一区二区三区日韩| 伊人久久大香线蕉综合网蜜芽| 亚洲高清精品中出| 欧美激情日韩| 国产乱子夫妻xx黑人xyx真爽| 日韩av一级片| 国产又粗又猛大又黄又爽| 99热99精品| 性爱在线免费视频| 亚洲图片欧美色图| 欧美成人精品网站| 日韩精品在线一区二区| 亚洲色图另类小说| 日韩一二三在线视频播| 一二三四区在线观看| 久久久久一本一区二区青青蜜月| 欧美日韩免费观看视频| 亚洲在线观看视频| 最新国产精品视频| 亚洲五码在线观看视频| 久久九九精品| 曰本三级日本三级日本三级| 久久久蜜臀国产一区二区| 日本高清不卡免费| 欧美性感美女h网站在线观看免费| 在线免费a视频| 日韩av在线高清| 麻豆tv在线| 日本一本a高清免费不卡| 美女精品视频在线| 少妇精品久久久久久久久久| 国精品一区二区| 亚洲欧美偷拍另类| 26uuu国产电影一区二区| 69xx绿帽三人行| 欧美在线一区二区| 午夜视频在线免费播放| 超碰91人人草人人干| 国精产品一区一区三区四川| 国产日韩欧美二区| 亚洲影视一区二区三区| 亚洲综合在线网站| 91在线观看下载| 久久久久久免费观看| 欧美剧在线免费观看网站| 你懂的在线网址| 久久久久久12| 精品国产第一国产综合精品| 亚洲欧洲精品在线| 亚洲免费在线| 国产伦精品一区二区三区妓女| 亚洲日本在线天堂| 91国产免费视频| 一本色道久久88综合日韩精品 | 国产精品久久久久久久午夜 | 亚洲精品8mav| 老司机午夜免费精品视频 | 国产伦理吴梦梦伦理| 伊人青青综合网站| 日日av拍夜夜添久久免费| 久久日韩精品| 一区二区三区高清视频在线观看| 日批免费观看视频| 亚洲国产精品影院| 色一情一乱一区二区三区| 欧美日本中文字幕| 6080亚洲理论片在线观看| 久久99国产精品一区| 国内成人精品2018免费看| 成人自拍小视频| 日韩区在线观看| 羞羞的视频在线观看| 99se婷婷在线视频观看| 在线免费高清一区二区三区| 中文字幕天堂av| 亚洲成国产人片在线观看| 欧美视频久久久| 国产91精品久久久久久| 你微笑时很美电视剧整集高清不卡| 又粗又黑又大的吊av| 91色综合久久久久婷婷| 黄色av一级片| 中文字幕日韩电影| 亚洲一区有码| 欧美激情亚洲天堂| jvid福利写真一区二区三区| 久久不卡免费视频| 亚洲欧美精品中文字幕在线| 日韩精品三区| 在线观看成人av电影| 国产激情精品久久久第一区二区 | 色婷婷国产精品| 韩国免费在线视频| 国产日本欧美在线观看| 欧美1区免费| 中文字幕 亚洲一区| 在线精品亚洲一区二区不卡| 午夜激情视频在线| 国产成人免费观看| 免费亚洲婷婷| 亚洲一二三四五六区| 精品国产91九色蝌蚪| 秋霞伦理一区| 一区二区三区四区国产| 国产成人亚洲精品狼色在线| 免费看日韩毛片| 在线观看成人黄色| 97久久亚洲| 欧美黄色一级片视频| 亚洲视频在线一区观看| 天天操天天干天天| 国产精品久久久久久久久久久久久| 亚洲深深色噜噜狠狠爱网站| 国产精品无码专区| 欧美日韩中文另类| 97在线超碰| 亚洲国产日韩美| 成人免费视频免费观看| 亚洲av无码乱码国产精品fc2| 久久综合色影院| 久久99高清| 少妇丰满尤物大尺度写真| 日本福利一区二区| 超黄网站在线观看| 中文字幕成人一区| 国产视频911| 少妇av在线播放| 91久久久久久| 久久久水蜜桃av免费网站|