Mybatis的一級(jí)緩存和二級(jí)緩存原理分析與使用
Mybatis的一級(jí)緩存和二級(jí)緩存
Mybatis會(huì)將相同查詢(xún)條件的SQL語(yǔ)句的查詢(xún)結(jié)果存儲(chǔ)在內(nèi)存或者某種緩存介質(zhì)中,當(dāng)下次遇到相同的SQL時(shí)不執(zhí)行該SQL,而是直接從緩存中獲取結(jié)果,減少服務(wù)器的壓力,尤其是在查詢(xún)?cè)蕉?、緩存命中率越高的情況下,使用緩存對(duì)性能的提高更明顯。
Mybatis緩存分為一級(jí)緩存和二級(jí)緩存,一級(jí)緩存是將結(jié)果緩存在SqlSession對(duì)象中,二級(jí)緩存是存儲(chǔ)在SqlSessionFactory對(duì)象中。默認(rèn)情況下,Mybatis開(kāi)啟一級(jí)緩存,不開(kāi)啟二級(jí)緩存當(dāng)數(shù)據(jù)量更大時(shí),可以借助第三方緩存技術(shù)協(xié)助保存Mybatis的二級(jí)緩存數(shù)據(jù)

如果SqlSession調(diào)用了close()方法,會(huì)釋放掉一級(jí)緩存PerpetualCache對(duì)象,一級(jí)緩存將不可用如果SqlSession調(diào)用了clearCache(),會(huì)清空PerpetualCache對(duì)象中的數(shù)據(jù),但是該對(duì)象仍可使用 SqlSession中執(zhí)行了任何一個(gè)update操作(update()、delete()、insert()),都會(huì)清空PerpetualCache對(duì)象的數(shù)據(jù),但是該對(duì)象可以繼續(xù)使用
1 Mybatis如何判斷兩次查詢(xún)是完全相同的查詢(xún)
如果以下條件完全一樣,Mybatis則認(rèn)為是相同的查詢(xún)
-- 傳入的statementid。
-- 查詢(xún)時(shí)要求的結(jié)果集中的結(jié)果范圍
-- 這次查詢(xún)所產(chǎn)生的最終要傳遞給Preparedstatement的Sql語(yǔ)句字符串
-- 傳遞的參數(shù)值
@Test
public void testCacheOne(){
SqlSession sqlSession = MybatisUtil.getSqlSession();
UserDao userDao = sqlSession.getMapper(UserDao.class);
Users users = userDao.selectUsersById(1);
Users users1 = userDao.selectUsersById(1);
System.out.println(users);
System.out.println(users1);
}

查詢(xún)兩次,數(shù)據(jù)庫(kù)查詢(xún)了一次
@Test
public void testCacheOne(){
SqlSession sqlSession = MybatisUtil.getSqlSession();
UserDao userDao = sqlSession.getMapper(UserDao.class);
Users users = userDao.selectUsersById(1);
//清空緩存
sqlSession.clearCache();
Users users1 = userDao.selectUsersById(1);
System.out.println(users);
System.out.println(users1);
}

清空緩存,數(shù)據(jù)庫(kù)查詢(xún)了兩次
2 二級(jí)緩存
? Mybatis的二級(jí)緩存是Application級(jí)別的緩存,它可以提高對(duì)數(shù)據(jù)庫(kù)查詢(xún)的效率,二級(jí)緩存SqlSessionFactory上緩存,可以是由一個(gè)SqlSessionFactory創(chuàng)建的不同的SqlSession之間共享緩存數(shù)據(jù)。默認(rèn)不開(kāi)啟。SqlSession在執(zhí)行commit()或者close()的時(shí)候?qū)?shù)據(jù)放入到二級(jí)緩存


2.1 二級(jí)緩存配置
Mybatis實(shí)現(xiàn)二級(jí)緩存的實(shí)體類(lèi)必須是可序列化的,也就是要求實(shí)現(xiàn)Serializable接口。在映射配置文件中配置就可以開(kāi)啟緩存了
2.2 二級(jí)緩存特點(diǎn)
映射語(yǔ)句文件中的所有select查詢(xún)語(yǔ)句都會(huì)被緩存
insert、update、delete語(yǔ)句會(huì)刷新緩存
二級(jí)緩存是以namespace為單位,不同namespace下的操作互不影響
如果在加入<cache/>標(biāo)簽的前提下讓個(gè)別select元素不適用緩存,可以使用useCache屬性,設(shè)置為false
2.3 配置二級(jí)緩存
在mybatis-config.xml文件中標(biāo)簽配置開(kāi)啟二級(jí)緩存。cacheEnabled的值就是true,可省略
<settings>
<setting name="cacheEnable" value="true"/>
</settings>
在映射文件中添加
<mapper namespace="com.zd.dao.UserDao">
<cache/>
</mapper>
2.4 測(cè)試

@Test
public void testCacheTwo(){
SqlSession sqlSession=MybatisUtil.getSqlSession();
UserDao userDao = sqlSession.getMapper(UserDao.class);
Users users = userDao.selectUsersById(1);
System.out.println(users);
//關(guān)閉SqlSession后,重新獲取SqlSession對(duì)象查詢(xún)
MybatisUtil.closeSqlSession();
SqlSession sqlSession2=MybatisUtil.getSqlSession();
UserDao userDao2 = sqlSession2.getMapper(UserDao.class);
Users users2 = userDao2.selectUsersById(1);
System.out.println(users2);
}

查詢(xún)了一次,可以看出不同的SqlSession之間共享緩存數(shù)據(jù)。
到此這篇關(guān)于Mybatis的一級(jí)緩存和二級(jí)緩存原理分析與使用的文章就介紹到這了,更多相關(guān)Mybatis 緩存內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- 一文搞懂MyBatis一級(jí)緩存和二級(jí)緩存
- Java Mybatis一級(jí)緩存和二級(jí)緩存
- MyBatis一級(jí)緩存與二級(jí)緩存原理與作用分析
- mybatis一級(jí)緩存和二級(jí)緩存的區(qū)別及說(shuō)明
- Mybatis詳細(xì)對(duì)比一級(jí)緩存與二級(jí)緩存
- Mybatis?一級(jí)緩存和二級(jí)緩存原理區(qū)別
- 關(guān)于mybatis的一級(jí)緩存和二級(jí)緩存的那些事兒
- Mybatis 一級(jí)緩存與二級(jí)緩存的實(shí)現(xiàn)
- MyBatis 延遲加載、一級(jí)緩存、二級(jí)緩存(詳解)
- MyBatis中一級(jí)緩存和二級(jí)緩存的區(qū)別
相關(guān)文章
Maven生成及安裝jar包到本地倉(cāng)庫(kù)的方法
這篇文章主要介紹了Maven生成及安裝jar包到本地倉(cāng)庫(kù)的方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-10-10
Spring整合Quartz Job以及Spring Task的實(shí)現(xiàn)方法
下面小編就為大家分享一篇Spring整合Quartz Job以及Spring Task的實(shí)現(xiàn)方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2017-12-12
SpringBoot實(shí)現(xiàn)文件在線預(yù)覽功能的全過(guò)程
我們開(kāi)發(fā)業(yè)務(wù)系統(tǒng)的時(shí)候,經(jīng)常有那種文檔文件在線預(yù)覽的需求,下面這篇文章主要給大家介紹了關(guān)于SpringBoot實(shí)現(xiàn)文件在線預(yù)覽功能的相關(guān)資料,需要的朋友可以參考下2021-11-11
Swift洗牌動(dòng)畫(huà)效果的實(shí)現(xiàn)方法
這篇文章主要介紹了Swift洗牌動(dòng)畫(huà)效果的實(shí)現(xiàn)方法,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友參考下吧2016-12-12
springboot Interceptor攔截器excludePathPatterns忽略失效
這篇文章主要介紹了springboot Interceptor攔截器excludePathPatterns忽略失效的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-07-07
Java中從JSON轉(zhuǎn)Java實(shí)體的多種方法詳解
在現(xiàn)在的日常開(kāi)發(fā)中不管前端還是后端,JSON 格式的數(shù)據(jù)是用得比較多的,甚至可以說(shuō)無(wú)處不在,這篇文章主要給大家介紹了關(guān)于Java中從JSON轉(zhuǎn)Java實(shí)體的多種方法,需要的朋友可以參考下2023-12-12
JVM調(diào)整java虛擬機(jī)可使用的最大內(nèi)存的方法
本文主要介紹了調(diào)整JVM的內(nèi)存參數(shù)來(lái)優(yōu)化Java應(yīng)用程序的性能,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2025-01-01
Java虛擬機(jī)調(diào)用Java主類(lèi)的main()方法
這篇文章主要介紹了Java虛擬機(jī)調(diào)用Java主類(lèi)的main()方法,前一篇文章我們介紹了關(guān)于Java虛擬機(jī)HotSpot2021-11-11

