MyBatis中的快取

2021-08-14 14:32:06 字數 1365 閱讀 3162

mybatis作為持久化框架,提供了非常強大的快取特性。一般在提到mybatis快取的時候,指的都是二級快取。一級快取,即本地快取,缺省會啟用並且不能控制,可能會導致一些難以發現的錯誤。

一、一級快取

public void testl1cache()  finally 

system.out.println("開啟新的sqlsession");

sqlsession = getsqlsession();

try finally

}

在如上的測試**中,獲取到user1之後,重新設定了username的值,但並未更新到資料庫中;當再次執行該物件的查詢之後,發現得到的user2物件的username屬性和user1之前重新設定的值一樣,並且此時user1和user2是同乙個物件。這就是一級快取導致的。

mybatis的一級快取存在於sqlsession的生命週期當中,意思就是說,在同乙個sqlsession中執行的查詢操作,且中間不包括增刪改的操作時,如果該物件在之前已經查詢過,新查詢獲取到的都將是儲存在快取中的這個物件。當二級快取沒有開啟時,我們重新開啟乙個sqlsession,這時再查詢,就不再是之前的快取的那個物件了。這是因為在sqlsession關閉時,快取已經被清空了。

如果不想讓該方法使用一級快取,可以在該方法的xml檔案中增加 flushcache="true" 的屬性。這樣配置之後,在該方法的每次查詢之前都會清空當前的一級快取,重新從資料庫中查詢物件,可以避免上面的問題。但是這個方法由於清空了一級快取,會影響當前sqlsession快取的所有查詢,會增加資料庫的查詢次數,導致效能的下降。

二、二級快取

不同於一級快取,二級快取的生命週期可以理解為sqlsessionfactory的生命週期。二級快取的相關配置在這裡就不敘述了。需要注意的是,xml配置方式和註解配置方式不能同時使用,會因為命名空間的衝突而導致異常,可以將其中乙個改為參照快取即可。

public void testl2cache()finally

system.out.println("開啟新的sqlsession");

tryfinally

}

上面的測試**中,再次獲取role2時,即使已經在乙個新的sqlsession當中,一級快取已經清空,role2並不會執行資料庫的查詢操作,而是到mybatis的二級快取中取出物件,此時role2的rolename屬性為之前修改後的值。由於在本測試用例中,配置的二級快取屬性為可讀寫快取,role2和role3都是反序列化的介面,所以他們並不是相同的例項。如果配置為唯讀快取,role2和role3獲得的將是快取中role1的引用,將會是相同的例項。

目前,mybatis支援ehcache快取框架以及redis快取資料庫來儲存mybatis的二級快取。

Mybatis中的快取

title mybatis中的快取 tags 新建,模板,小書匠 想要了解mybatis中的快取機制,我們先來看什麼是快取,簡單來說,快取就是存在於記憶體中的臨時資料。那麼,我們為什麼要使用快取呢,就是為了減少與資料庫的互動次數,提高執行效率。那麼問題來了,什麼樣的資料適合存在於快取中呢 首先是經常...

mybatis中的快取

存在於記憶體中的臨時shuju 減少和資料庫的互動次數,提高效率 它指的是mybatis中sqlsession物件的快取。當我們執行查詢之後,查詢的結果同時會存入到sqlsession為我們提供的一塊區域當中。該區域的結構是乙個map結構。當我們再次查詢同樣的資料時,mybatis會先去sqlses...

mybatis中的快取

mybatis中的快取和hibernate的快取類似,也分為一級快取和二級快取 一級快取 為sqlsession級別的快取。預設開啟。使用同乙個sqlsession執行查詢時,會先從sqlsession的快取中去獲取資料,如果快取中不存在,再去資料庫中查詢,並將查詢結果快取到sqlsession。特...