深入理解Mybatis一級(jí)緩存
客戶端向數(shù)據(jù)庫(kù)服務(wù)器發(fā)送同樣的sql查詢語(yǔ)句,如果每次都去訪問(wèn)數(shù)據(jù)庫(kù),會(huì)導(dǎo)致性能的降低。
那么怎么提高呢?
mybatis為我們提供了一級(jí)緩存的策略
在一個(gè)sqlSession開(kāi)啟和關(guān)閉之間,sqlSession對(duì)象內(nèi)部(其實(shí)是Executor)會(huì)維護(hù)一個(gè)緩存的對(duì)象,當(dāng)查詢數(shù)據(jù)時(shí)候,先從緩存中尋找是否存在該條數(shù)據(jù),存在就直接取出來(lái),不存在,向數(shù)據(jù)庫(kù)發(fā)送sql查詢, 然后將查詢后的數(shù)據(jù)存入緩存,和返回給程序。
這樣會(huì)存在一個(gè)問(wèn)題:
如果在第一次和第二次查詢期間,有程序更改了要查訊的數(shù)據(jù)庫(kù)的數(shù)據(jù),就會(huì)引起讀取的數(shù)據(jù)是錯(cuò)誤的,也就是
臟讀,其實(shí)是mybatis在sqlSession執(zhí)行commit()方法后會(huì)清空這個(gè)緩存。第二次去查詢,依然會(huì)從數(shù)據(jù)庫(kù)中查詢.
也可以手動(dòng)調(diào)用sqlSession的clearCache()方法清除緩存
小例子:
@Test public void testCacheLever1() throws Exception{ SqlSession session = factory.openSession(); UserMapper mapper = session.getMapper(UserMapper.class); //第一次請(qǐng)求,查詢id為1的用戶 User user = mapper.findUserById(1); System.out.println(user); //更改數(shù)據(jù),會(huì)清空緩存 user.setUsername("yyyy"); mapper.updateUser(user); session.commit(); //第二次查詢會(huì)從緩存中找 User user2 = mapper.findUserById(1); System.out.println(user2); session.close(); }
問(wèn)題:
如果sqlSession關(guān)閉了,緩存也就清空了。這怎么使用緩存來(lái)提高效率呢?
好了,下篇文章給大家介紹mybatis二級(jí)緩存。
以上所述是小編給大家介紹的Mybatis一級(jí)緩存,希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
相關(guān)文章
SpringBoot中JPA更新時(shí)部分字段無(wú)效
本文主要介紹了SpringBoot中JPA更新時(shí)部分字段無(wú)效,在通過(guò)注解自動(dòng)更新時(shí),部分字段在調(diào)試時(shí)可以找到,卻沒(méi)有被自動(dòng)更新到數(shù)據(jù)庫(kù)中,下面就介紹一下解決方法2023-04-04Java返回文件時(shí)為圖片或pdf等設(shè)置在線預(yù)覽或下載功能
這篇文章主要介紹了Java返回文件時(shí)為圖片或pdf等設(shè)置在線預(yù)覽或下載功能,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2024-01-01解決spring-data-jpa 事物中修改屬性自動(dòng)更新update問(wèn)題
這篇文章主要介紹了解決spring-data-jpa 事物中修改屬性自動(dòng)更新update問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家2021-08-08java使用泛型實(shí)現(xiàn)棧結(jié)構(gòu)示例分享
泛型是Java SE5.0的重要特性,使用泛型編程可以使代碼獲得最大的重用。由于在使用泛型時(shí)要指明泛型的具體類型,這樣就避免了類型轉(zhuǎn)換。本實(shí)例將使用泛型來(lái)實(shí)現(xiàn)一個(gè)棧結(jié)構(gòu),并對(duì)其進(jìn)行測(cè)試2014-03-03SpringBoot Mybatis動(dòng)態(tài)數(shù)據(jù)源切換方案實(shí)現(xiàn)過(guò)程
這篇文章主要介紹了SpringBoot+Mybatis實(shí)現(xiàn)動(dòng)態(tài)數(shù)據(jù)源切換方案過(guò)程,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-04-04JDK21無(wú)法導(dǎo)入TimeUnit類的解決辦法
這篇文章主要給大家介紹了關(guān)于JDK21無(wú)法導(dǎo)入TimeUnit類的解決辦法,TimeUnit是java.util.concurrent包下面的一個(gè)類,TimeUnit提供了可讀性更好的線程暫停操作,通常用來(lái)替換Thread.sleep(),需要的朋友可以參考下2024-01-01hibernate中HQL如何調(diào)用自定義函數(shù)
這篇文章主要介紹了hibernate中HQL如何調(diào)用自定義函數(shù)問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-09-09