亚洲视频二区_亚洲欧洲日本天天堂在线观看_日韩一区二区在线观看_中文字幕不卡一区

公告:魔扣目錄網(wǎng)為廣大站長提供免費(fèi)收錄網(wǎng)站服務(wù),提交前請做好本站友鏈:【 網(wǎng)站目錄:http://www.430618.com 】, 免友鏈快審服務(wù)(50元/站),

點(diǎn)擊這里在線咨詢客服
新站提交
  • 網(wǎng)站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會(huì)員:747

JAVA面試經(jīng)常問到MyBatis一級(jí)緩存和二級(jí)緩存,今天就給大家重點(diǎn)詳解Mybatis一級(jí)緩存和二級(jí)緩存原理與區(qū)別

Mybatis緩存

緩存就是內(nèi)存中的數(shù)據(jù),常常來自對數(shù)據(jù)庫查詢結(jié)果的保存,使用緩存可以避免頻繁與數(shù)據(jù)庫進(jìn)行交互,從而提高查詢響應(yīng)速度。

MyBatis 提供了對緩存的支持,分為一級(jí)緩存和二級(jí)緩存,如下圖所示:

 

我們先大致了解下MyBatis一級(jí)緩存與MyBatis 二級(jí)緩存:

一級(jí)緩存:SqlSession級(jí)別的緩存,緩存的數(shù)據(jù)只在SqlSession內(nèi)有效。

二級(jí)緩存:mApper級(jí)別的緩存,同一個(gè)namespace公用這一個(gè)緩存,所以對SqlSession是共享的,二級(jí)緩存需要我們手動(dòng)開啟。

下面我們再分別詳解兩者的原理與區(qū)別。

1.為什么需要Mybatis一級(jí)緩存

當(dāng)我們使用Mybatis進(jìn)行數(shù)據(jù)庫的操作時(shí)候,會(huì)創(chuàng)建一個(gè)SqlSession來進(jìn)行一次數(shù)據(jù)庫的會(huì)話,會(huì)話結(jié)束則關(guān)閉SqlSession對象。

如果我們很有可能多次查詢完全相同的sql語句,每一次查詢都查詢一次數(shù)據(jù)庫,那查詢數(shù)據(jù)庫代價(jià)是比較大的,這會(huì)導(dǎo)致系統(tǒng)的資源浪費(fèi)。

為了解決這個(gè)問題,Mybatis對每一次會(huì)話都添加了緩存操作,不用相同的SQL每次都需要查詢數(shù)據(jù)庫,這就是Mybatis一級(jí)緩存的作用。

2.Mybatis一級(jí)緩存的實(shí)現(xiàn)

我們知道對SqlSession的操作,mybatis內(nèi)部都是通過Executor來執(zhí)行的,Executor的生命周期和SqlSession是一致的。

Mybatis在Executor中創(chuàng)建了本地緩存(一級(jí)緩存),如下圖所示:

 

大致的流程如下:

第一次查詢用戶id信息,先去緩存中查詢是否有,如果沒有,從數(shù)據(jù)庫中查詢用戶信息,得到用戶信息后在將用戶信息儲(chǔ)存到一級(jí)緩存中。

如果sqlSession去執(zhí)行commit操作(插入、更新、刪除),清空sqlSession中的一級(jí)緩存,保證緩存中始終保存的是最新的信息,避免臟讀。

第二次查詢用戶id信息,先去緩存中查詢,如緩存中有,直接從緩存中獲取。

注意:兩次查詢須在同一個(gè)sqlsession中完成,否則將不會(huì)走mybatis的一級(jí)緩存。

在mybatis與spring進(jìn)行整合開發(fā)時(shí),事務(wù)控制在service中進(jìn)行,重復(fù)調(diào)用兩次servcie將不會(huì)走一級(jí)緩存,因?yàn)樵诘诙握{(diào)用時(shí)session方法結(jié)束,SqlSession就關(guān)閉了。

3.Mybatis一級(jí)緩存配置

mybatis一級(jí)緩存的范圍有SESSION和STATEMENT兩種,默認(rèn)是SESSION。

如果不想使用一級(jí)緩存,可以把一級(jí)緩存的范圍指定為STATEMENT,這樣每次執(zhí)行完一個(gè)Mapper中的語句后都會(huì)將一級(jí)緩存清除。

如果需要更改一級(jí)緩存的范圍,可以在Mybatis的配置文件中,在下通過localCacheScope指定。

<setting name="localCacheScope" value="STATEMENT"/>

Mybatis二級(jí)緩存

1.為什么需要Mybatis二級(jí)緩存?

MyBatis 一級(jí)緩存最大的共享范圍就是一個(gè)SqlSession內(nèi)部,那么如果多個(gè) SqlSession 需要共享緩存,則需要開啟二級(jí)緩存。

2.Mybatis二級(jí)緩存的實(shí)現(xiàn)

開啟二級(jí)緩存后,會(huì)使用 CachingExecutor 裝飾 Executor,進(jìn)入一級(jí)緩存的查詢流程前,先在 CachingExecutor 進(jìn)行二級(jí)緩存的查詢,具體的工作流程如下所示。

 

二級(jí)緩存開啟后,同一個(gè) namespace 下的所有操作語句,都影響著同一個(gè) Cache,即二級(jí)緩存被多個(gè) SqlSession 共享,是一個(gè)全局的變量。

當(dāng)開啟緩存后,數(shù)據(jù)的查詢執(zhí)行的流程就是 二級(jí)緩存 -> 一級(jí)緩存 -> 數(shù)據(jù)庫。

MyBatis 是默認(rèn)關(guān)閉二級(jí)緩存的,因?yàn)閷τ谠鰟h改操作頻繁的話,那么二級(jí)緩存形同虛設(shè),每次都會(huì)被清空緩存。

Mybatis一級(jí)緩存與二級(jí)緩存的區(qū)別

1)一級(jí)緩存 Mybatis的一級(jí)緩存是指SQLSession,一級(jí)緩存的作用域是SQlSession, Myabits默認(rèn)開啟一級(jí)緩存。

在同一個(gè)SqlSession中,執(zhí)行相同的SQL查詢時(shí);第一次會(huì)去查詢數(shù)據(jù)庫,并寫在緩存中,第二次會(huì)直接從緩存中取。當(dāng)執(zhí)行SQL時(shí)候兩次查詢中間發(fā)生了增刪改的操作,則SQLSession的緩存會(huì)被清空。

每次查詢會(huì)先去緩存中找,如果找不到,再去數(shù)據(jù)庫查詢,然后把結(jié)果寫到緩存中。Mybatis的內(nèi)部緩存使用一個(gè)HashMap,key為hashcode+statementId+sql語句。Value為查詢出來的結(jié)果集映射成的java對象。SqlSession執(zhí)行insert、update、delete等操作commit后會(huì)清空該SQLSession緩存。

2) Mybatis二級(jí)緩存是默認(rèn)不開啟的,作用于一個(gè)Application,是Mapper級(jí)別的,多個(gè)SqlSession使用同一個(gè)Mapper的sql能夠使用二級(jí)緩存。

分享到:
標(biāo)簽:Mybatis
用戶無頭像

網(wǎng)友整理

注冊時(shí)間:

網(wǎng)站:5 個(gè)   小程序:0 個(gè)  文章:12 篇

  • 51998

    網(wǎng)站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會(huì)員

趕快注冊賬號(hào),推廣您的網(wǎng)站吧!
最新入駐小程序

數(shù)獨(dú)大挑戰(zhàn)2018-06-03

數(shù)獨(dú)一種數(shù)學(xué)游戲,玩家需要根據(jù)9

答題星2018-06-03

您可以通過答題星輕松地創(chuàng)建試卷

全階人生考試2018-06-03

各種考試題,題庫,初中,高中,大學(xué)四六

運(yùn)動(dòng)步數(shù)有氧達(dá)人2018-06-03

記錄運(yùn)動(dòng)步數(shù),積累氧氣值。還可偷

每日養(yǎng)生app2018-06-03

每日養(yǎng)生,天天健康

體育訓(xùn)練成績評定2018-06-03

通用課目體育訓(xùn)練成績評定