Mybatis的一級緩存和二級緩存原理分析與使用
Mybatis的一級緩存和二級緩存
Mybatis會將相同查詢條件的SQL語句的查詢結(jié)果存儲在內(nèi)存或者某種緩存介質(zhì)中,當下次遇到相同的SQL時不執(zhí)行該SQL,而是直接從緩存中獲取結(jié)果,減少服務(wù)器的壓力,尤其是在查詢越多、緩存命中率越高的情況下,使用緩存對性能的提高更明顯。
Mybatis緩存分為一級緩存和二級緩存,一級緩存是將結(jié)果緩存在SqlSession對象中,二級緩存是存儲在SqlSessionFactory對象中。默認情況下,Mybatis開啟一級緩存,不開啟二級緩存當數(shù)據(jù)量更大時,可以借助第三方緩存技術(shù)協(xié)助保存Mybatis的二級緩存數(shù)據(jù)
如果SqlSession調(diào)用了close()方法,會釋放掉一級緩存PerpetualCache對象,一級緩存將不可用如果SqlSession調(diào)用了clearCache(),會清空PerpetualCache對象中的數(shù)據(jù),但是該對象仍可使用 SqlSession中執(zhí)行了任何一個update操作(update()、delete()、insert()),都會清空PerpetualCache對象的數(shù)據(jù),但是該對象可以繼續(xù)使用
1 Mybatis如何判斷兩次查詢是完全相同的查詢
如果以下條件完全一樣,Mybatis則認為是相同的查詢
-- 傳入的statementid。
-- 查詢時要求的結(jié)果集中的結(jié)果范圍
-- 這次查詢所產(chǎn)生的最終要傳遞給Preparedstatement的Sql語句字符串
-- 傳遞的參數(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); }
查詢兩次,數(shù)據(jù)庫查詢了一次
@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ù)庫查詢了兩次
2 二級緩存
? Mybatis的二級緩存是Application級別的緩存,它可以提高對數(shù)據(jù)庫查詢的效率,二級緩存SqlSessionFactory上緩存,可以是由一個SqlSessionFactory創(chuàng)建的不同的SqlSession之間共享緩存數(shù)據(jù)。默認不開啟。SqlSession在執(zhí)行commit()或者close()的時候?qū)?shù)據(jù)放入到二級緩存
2.1 二級緩存配置
Mybatis實現(xiàn)二級緩存的實體類必須是可序列化的,也就是要求實現(xiàn)Serializable接口。在映射配置文件中配置就可以開啟緩存了
2.2 二級緩存特點
映射語句文件中的所有select查詢語句都會被緩存
insert、update、delete語句會刷新緩存
二級緩存是以namespace為單位,不同namespace下的操作互不影響
如果在加入<cache/>標簽的前提下讓個別select元素不適用緩存,可以使用useCache屬性,設(shè)置為false
2.3 配置二級緩存
在mybatis-config.xml文件中標簽配置開啟二級緩存。cacheEnabled的值就是true,可省略
<settings> <setting name="cacheEnable" value="true"/> </settings>
在映射文件中添加
<mapper namespace="com.zd.dao.UserDao"> <cache/> </mapper>
2.4 測試
@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對象查詢 MybatisUtil.closeSqlSession(); SqlSession sqlSession2=MybatisUtil.getSqlSession(); UserDao userDao2 = sqlSession2.getMapper(UserDao.class); Users users2 = userDao2.selectUsersById(1); System.out.println(users2); }
查詢了一次,可以看出不同的SqlSession之間共享緩存數(shù)據(jù)。
到此這篇關(guān)于Mybatis的一級緩存和二級緩存原理分析與使用的文章就介紹到這了,更多相關(guān)Mybatis 緩存內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Hadoop環(huán)境配置之hive環(huán)境配置詳解
這篇文章主要介紹了Hadoop環(huán)境配置之hive環(huán)境配置,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-12-12spring,mybatis事務(wù)管理配置與@Transactional注解使用詳解
這篇文章主要介紹了spring,mybatis事務(wù)管理配置與@Transactional注解使用,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-07-07