什么是緩存?
在講解MyBatis的緩存機(jī)制之前,我們先來(lái)了解什么是緩存。
緩存就是將我們經(jīng)常查詢的數(shù)據(jù)的結(jié)果保存到一個(gè)內(nèi)存中(緩存就是內(nèi)存中的一個(gè)對(duì)象),那么在下一次查詢的時(shí)候就不用到數(shù)據(jù)庫(kù)文件中查詢,而是從內(nèi)存中獲取,從而減少與數(shù)據(jù)庫(kù)的交付次數(shù)提高了響應(yīng)速度。
假如有一條數(shù)據(jù)的查詢量非常大,且內(nèi)容基本不變,反復(fù)查詢就會(huì)讓數(shù)據(jù)庫(kù)壓力變大,這時(shí)我們就可以將數(shù)據(jù)存在內(nèi)存緩存中,這樣就大大提高的了查詢效率,同時(shí)緩解了數(shù)據(jù)庫(kù)壓力。
MyBatis的緩存機(jī)制MyBatis提供了一級(jí)緩存和二級(jí)緩存
一級(jí)緩存:也稱為本地緩存,用于保存用戶在一次會(huì)話過(guò)程中查詢的結(jié)果,用戶一次會(huì)話中只能使用一個(gè)sqlSession,一級(jí)緩存是默認(rèn)開啟的。在同一個(gè) sqlSession 中兩次執(zhí)行相同的 sql 語(yǔ)句,第一次執(zhí)行完畢會(huì)將數(shù)據(jù)庫(kù)中查詢的數(shù)據(jù)寫到緩存(內(nèi)存),第二次會(huì)從緩存中獲取,從而提高查詢效率。當(dāng)一個(gè) sqlSession 結(jié)束后該 sqlSession 中的 一級(jí)緩存也就不存在了。
二級(jí)緩存:也稱為全局緩存,是mapper級(jí)別的緩存,是針對(duì)一個(gè)表的查結(jié)果的存儲(chǔ),可以共享給所有針對(duì)這張表的查詢的用戶。二級(jí)緩存是多個(gè) SqlSession 共享的,其作用域是 mapper 的同一個(gè) namespace,不同的 sqlSession 兩次執(zhí)行相同 namespace 下的 sql 語(yǔ)句且向 sql 中傳遞參數(shù)也相同,即最終執(zhí)行相同的 sql 語(yǔ)句,第一次執(zhí)行完畢會(huì)將數(shù)據(jù)庫(kù)中查詢的數(shù)據(jù)寫到緩存(內(nèi)存),第二次會(huì)從緩存中獲取數(shù)據(jù),而不再?gòu)臄?shù)據(jù)庫(kù)查詢,從而提高查詢效率。Mybatis默認(rèn)沒(méi)有開啟二級(jí)緩存,需要手動(dòng)配置。