MyBatis---缓存-提高检索效率的利器
目錄
讓我們來看看官方文檔
緩存
一.一級(jí)緩存
1.基本介紹 ?
2.一級(jí)緩存
3.一級(jí)緩存失效分析
二.二級(jí)緩存
1.基本介紹
2.二級(jí)緩存快速入門?
2.1快速入門
3.注意事項(xiàng)和使用陷阱
三.Mybatis 的一級(jí)緩存和二級(jí)緩存執(zhí)行順序
四.EhCache 緩存
1.基本介紹
2.配置和使用 EhCache
2.1. 加入相關(guān)依賴pom.xml
2.2mybatis-config.xml 仍然打開二級(jí)緩存
2.3加入配置文件ehcache.xml
2.4在 XxxMapper.xml 中啟用 EhCache , 當(dāng)然原來 MyBatis 自帶的緩存配置就注銷了
2.5測(cè)試
3.EhCache 緩存-細(xì)節(jié)說明
讓我們來看看官方文檔
緩存
MyBatis 內(nèi)置了一個(gè)強(qiáng)大的事務(wù)性查詢緩存機(jī)制,它可以非常方便地配置和定制。 為了使它更加強(qiáng)大而且易于配置,我們對(duì) MyBatis 3 中的緩存實(shí)現(xiàn)進(jìn)行了許多改進(jìn)。
默認(rèn)情況下,只啟用了本地的會(huì)話緩存,它僅僅對(duì)一個(gè)會(huì)話中的數(shù)據(jù)進(jìn)行緩存。 要啟用全局的二級(jí)緩存,只需要在你的 SQL 映射文件中添加一行:
<cache/>基本上就是這樣。這個(gè)簡(jiǎn)單語句的效果如下:
- 映射語句文件中的所有 select 語句的結(jié)果將會(huì)被緩存。
- 映射語句文件中的所有 insert、update 和 delete 語句會(huì)刷新緩存。
- 緩存會(huì)使用最近最少使用算法(LRU, Least Recently Used)算法來清除不需要的緩存。
- 緩存不會(huì)定時(shí)進(jìn)行刷新(也就是說,沒有刷新間隔)。
- 緩存會(huì)保存列表或?qū)ο?#xff08;無論查詢方法返回哪種)的 1024 個(gè)引用。
- 緩存會(huì)被視為讀/寫緩存,這意味著獲取到的對(duì)象并不是共享的,可以安全地被調(diào)用者修改,而不干擾其他調(diào)用者或線程所做的潛在修改。
提示?緩存只作用于 cache 標(biāo)簽所在的映射文件中的語句。如果你混合使用 Java API 和 XML 映射文件,在共用接口中的語句將不會(huì)被默認(rèn)緩存。你需要使用 @CacheNamespaceRef 注解指定緩存作用域。
這些屬性可以通過 cache 元素的屬性來修改。比如:
<cacheeviction="FIFO"flushInterval="60000"size="512"readOnly="true"/>這個(gè)更高級(jí)的配置創(chuàng)建了一個(gè) FIFO 緩存,每隔 60 秒刷新,最多可以存儲(chǔ)結(jié)果對(duì)象或列表的 512 個(gè)引用,而且返回的對(duì)象被認(rèn)為是只讀的,因此對(duì)它們進(jìn)行修改可能會(huì)在不同線程中的調(diào)用者產(chǎn)生沖突。
可用的清除策略有:
- LRU?– 最近最少使用:移除最長時(shí)間不被使用的對(duì)象。
- FIFO?– 先進(jìn)先出:按對(duì)象進(jìn)入緩存的順序來移除它們。
- SOFT?– 軟引用:基于垃圾回收器狀態(tài)和軟引用規(guī)則移除對(duì)象。
- WEAK?– 弱引用:更積極地基于垃圾收集器狀態(tài)和弱引用規(guī)則移除對(duì)象。
默認(rèn)的清除策略是 LRU。
flushInterval(刷新間隔)屬性可以被設(shè)置為任意的正整數(shù),設(shè)置的值應(yīng)該是一個(gè)以毫秒為單位的合理時(shí)間量。 默認(rèn)情況是不設(shè)置,也就是沒有刷新間隔,緩存僅僅會(huì)在調(diào)用語句時(shí)刷新。
size(引用數(shù)目)屬性可以被設(shè)置為任意正整數(shù),要注意欲緩存對(duì)象的大小和運(yùn)行環(huán)境中可用的內(nèi)存資源。默認(rèn)值是 1024。
readOnly(只讀)屬性可以被設(shè)置為 true 或 false。只讀的緩存會(huì)給所有調(diào)用者返回緩存對(duì)象的相同實(shí)例。 因此這些對(duì)象不能被修改。這就提供了可觀的性能提升。而可讀寫的緩存會(huì)(通過序列化)返回緩存對(duì)象的拷貝。 速度上會(huì)慢一些,但是更安全,因此默認(rèn)值是 false。
提示?二級(jí)緩存是事務(wù)性的。這意味著,當(dāng) SqlSession 完成并提交時(shí),或是完成并回滾,但沒有執(zhí)行 flushCache=true 的 insert/delete/update 語句時(shí),緩存會(huì)獲得更新。
一.一級(jí)緩存
1.基本介紹 ?
● 基本說明 1. 默認(rèn)情況下,mybatis 是啟用一級(jí)緩存的/本地緩存/local Cache,它是 SqlSession 級(jí)別的。 2. 同一個(gè) SqlSession 接口對(duì)象調(diào)用了相同的 select 語句,會(huì)直接從緩存里面獲取,而不是再 去查詢數(shù)據(jù)庫 ● 一級(jí)緩存原理圖【簡(jiǎn)單追一下源碼,后面還會(huì)詳細(xì)的 Debug】圖的解析:
? ? ? ? 客戶端/瀏覽器發(fā)出一個(gè)請(qǐng)求的時(shí)候,控制器會(huì)先去Executor中去查詢Local Cache去查有沒有,如果有就會(huì)直接返回給客戶端/瀏覽器,沒有就會(huì)去數(shù)據(jù)庫中去拿,同時(shí)也會(huì)放到?Local Cache中,下一次在查詢這個(gè)數(shù)據(jù)的時(shí)候就會(huì)直接從Local Cache中獲取。
2.一級(jí)緩存
當(dāng)我們第 1 次查詢 id=1 的 Monster 后,再次查詢 id=1 的 monster 對(duì)象,就會(huì)直接 從一級(jí)緩存獲取,不會(huì)再次發(fā)出 sql3.一級(jí)緩存失效分析
1. 關(guān)閉 sqlSession 會(huì)話后, 再次查詢,會(huì)到數(shù)據(jù)庫查詢, 修改 MonsterMapperTest.java, 測(cè) 試一級(jí)緩存失效情況 //測(cè)試一級(jí)緩存,失效//關(guān)閉sqlSession會(huì)話后 , 一級(jí)緩存失效@Testpublic void level1CacheTest2() {//查詢id=3的monsterMonster monster = monsterMapper.getMonsterById(3);System.out.println("monster=" + monster);//關(guān)閉sqlSession, 一級(jí)緩存失效if (sqlSession != null) {sqlSession.close();}//因?yàn)殛P(guān)閉了sqlSession,所以需要重新初始化sqlSession和 monsterMappersqlSession = MyBatisUtils.getSqlSession();monsterMapper = sqlSession.getMapper(MonsterMapper.class);//再次查詢id=3的monsterSystem.out.println("--如果你關(guān)閉了sqlSession,當(dāng)你再次查詢相同的id時(shí), 仍然會(huì)發(fā)出sql----");Monster monster2 = monsterMapper.getMonsterById(3);System.out.println("monster2=" + monster2);if (sqlSession != null) {sqlSession.close();}} 2. 當(dāng)執(zhí)行 sqlSession.clearCache() 會(huì)使一級(jí)緩存失效,修改 MonsterMapperTest.java, 測(cè) 試一級(jí)緩存失效情況(清除localcache中的緩存) //測(cè)試一級(jí)緩存,失效//如果執(zhí)行sqlSession.clearCache() , 會(huì)導(dǎo)致一級(jí)緩存失效@Testpublic void level1CacheTest3() {//查詢id=3的monsterMonster monster = monsterMapper.getMonsterById(3);System.out.println("monster=" + monster);//執(zhí)行clearCache/*** @Override* public void clearCache() {* executor.clearLocalCache();* }*/sqlSession.clearCache();//再次查詢id=3的monsterSystem.out.println("--如果你執(zhí)行sqlSession.clearCache(),當(dāng)你再次查詢相同的id時(shí), 仍然會(huì)發(fā)出sql----");Monster monster2 = monsterMapper.getMonsterById(3);System.out.println("monster2=" + monster2);if (sqlSession != null) {sqlSession.close();}} 3. 當(dāng)對(duì)同一個(gè) monster 修改,該對(duì)象在一級(jí)緩存會(huì)失效, 修改 MonsterMapperTest.java, 測(cè) 試一把 //測(cè)試一級(jí)緩存,失效//如果修改了同一個(gè)對(duì)象 , 會(huì)導(dǎo)致一級(jí)緩存[對(duì)象數(shù)據(jù)]失效@Testpublic void level1CacheTest4() {//查詢id=3的monsterMonster monster = monsterMapper.getMonsterById(3);System.out.println("monster=" + monster);//如果修改了同一個(gè)對(duì)象 , 會(huì)導(dǎo)致一級(jí)緩存[對(duì)象數(shù)據(jù)]失效monster.setName("螞蚱精");monsterMapper.updateMonster(monster);//再次查詢id=3的monsterSystem.out.println("--如果你修改了同一個(gè)對(duì)象,當(dāng)你再次查詢相同的id時(shí), 仍然會(huì)發(fā)出sql----");Monster monster2 = monsterMapper.getMonsterById(3);System.out.println("monster2=" + monster2);if (sqlSession != null) {sqlSession.commit();//這里需要commitsqlSession.close();}}二.二級(jí)緩存
1.基本介紹
● 基本介紹 1. 二級(jí)緩存和一級(jí)緩存都是為了提高檢索效率的技術(shù) 2. 最大的區(qū)別就是作用域的范圍不一樣,一級(jí)緩存的作用域是 sqlSession 會(huì)話級(jí)別,在一次 會(huì)話有效,而二級(jí)緩存作用域是全局范圍,針對(duì)不同的會(huì)話都有效(不管是哪一個(gè)sqlsession都有效) ● 二級(jí)緩存原理圖????????客戶端發(fā)出了一次請(qǐng)求或者說一次會(huì)話,這個(gè)時(shí)候假如你配置了二級(jí)緩存,會(huì)在CachingExecytor中會(huì)先有一個(gè)獲取二級(jí)緩存的動(dòng)作,在這個(gè)二級(jí)緩存中看有沒有數(shù)據(jù)(有自帶二級(jí)緩存和第三方緩存庫),查到了直接返回,沒有查到就會(huì)繼續(xù)往下走,到我們的一級(jí)緩存中去查找,在一次里面找到了也可以直接返回給客戶端,沒有找到繼續(xù)去數(shù)據(jù)庫查找。?
2.二級(jí)緩存快速入門?
2.1快速入門
1. mybatis-config.xml 配置中開啟二級(jí)緩存
<configuration><!-- 這里就是引入 jdbc.properties 文件 --><properties resource="jdbc.properties"/><settings><!-- 開啟二級(jí)緩存 --><setting name="cacheEnabled" value="true"/></settings>2.使用二級(jí)緩存時(shí) entity 類實(shí)現(xiàn)序列化接口 (serializable),因?yàn)槎?jí)緩存可能使用到序
列化技術(shù)3. 在對(duì)應(yīng)的 XxxMapper.xml 中設(shè)置二級(jí)緩存的策略
<mapper namespace="com.hong.mapper.MonsterMapper"><!--1、配置二級(jí)緩存: 是mybatis自帶2、FIFO – 先進(jìn)先出:按對(duì)象進(jìn)入緩存的順序來移除它們。3. flushInterval 刷新間隔 是毫秒單位 60000 表示 60s4. size="512": 引用數(shù)目, 屬性可以被設(shè)置為任意正整數(shù), 默認(rèn)10245. readOnly="true": (只讀)屬性可以被設(shè)置為 true 或 false: 如果我們只是用于讀操作,建議設(shè)置成 true, 這樣可以提示效率, 如果有修改操作,設(shè)置成 false, 默認(rèn)就是false--><cache eviction="FIFO" flushInterval="60000"size="512" readOnly="true"/>4.測(cè)試
//測(cè)試二級(jí)緩存的使用@Testpublic void level2CacheTest() {//查詢id=3的monsterMonster monster = monsterMapper.getMonsterById(3);System.out.println("monster=" + monster);//這里老師關(guān)閉sqlSessionif (sqlSession != null) {sqlSession.close();}//重新獲取sqlSessionsqlSession = MyBatisUtils.getSqlSession();//重新獲取了monsterMappermonsterMapper = sqlSession.getMapper(MonsterMapper.class);//再次查詢id=3的monsterSystem.out.println("--雖然前面關(guān)閉了sqlSession,因?yàn)榕渲枚?jí)緩存, " +"當(dāng)你再次查詢相同的id時(shí), 依然不會(huì)再發(fā)出sql, 而是從二級(jí)緩存獲取數(shù)據(jù)----");Monster monster2 = monsterMapper.getMonsterById(3);System.out.println("monster2=" + monster2);Monster monster3 = monsterMapper.getMonsterById(3);System.out.println("monster3=" + monster3);if (sqlSession != null) {sqlSession.close();}}3.注意事項(xiàng)和使用陷阱
1. 理解二級(jí)緩存策略的參數(shù) <cache eviction="FIFO" flushInterval="30000" size="360" readOnly="true"/> 上面的配置意思如下: 創(chuàng)建了 FIFO 的策略,每隔 30 秒刷新一次,最多存放 360 個(gè)對(duì)象而且返回的對(duì)象被認(rèn)為是只讀的。 eviction:緩存的回收策略 flushInterval:時(shí)間間隔,單位是毫秒, size:引用數(shù)目,內(nèi)存大就多配置點(diǎn),要記住你緩存的對(duì)象數(shù)目和你運(yùn)行環(huán)境的可用內(nèi)存 資源數(shù)目。默認(rèn)值是 1024 readOnly:true,只讀 2. 四大策略 √ LRU – 最近最少使用的:移除最長時(shí)間不被使用的對(duì)象,它是默認(rèn) √ FIFO – 先進(jìn)先出:按對(duì)象進(jìn)入緩存的順序來移除它們。 √ SOFT – 軟引用:移除基于垃圾回收器狀態(tài)和軟引用規(guī)則的對(duì)象。 √ WEAK – 弱引用:更積極地移除基于垃圾收集器狀態(tài)和弱引用規(guī)則的對(duì)象。 3. 如何禁用二級(jí)緩存 3.1mybatis-config.xml <settings><setting name="logImpl" value="STDOUT_LOGGING"/><!--全局性地開啟或關(guān)閉所有映射器配置文件中已配置的任何緩存, 默認(rèn)就是 true--><setting name="cacheEnabled" value="false"/> </settings>3.2MonsterMapper.xml
<!--<cache eviction="FIFO" flushInterval="30000" size="360" readOnly="true"/>-->
3.3或者更加細(xì)粒度的, 在配置方法上指定
設(shè)置 useCache=false 可以禁用當(dāng)前 select 語句的二級(jí)緩存,即每次查詢都會(huì)發(fā)出 sql 去查詢, 默認(rèn)情況是 true,即該 sql 使用二級(jí)緩存。?注意:一般我們不需要去修改,使用默認(rèn)的即可
4. mybatis 刷新二級(jí)緩存的設(shè)置
<update id="updateMonster" parameterType="Monster" flushCache="true">UPDATE mybatis_monster SET NAME=#{name},age=#{age} WHERE id=#{id} </update> insert、update、delete 操作數(shù)據(jù)后需要刷新緩存,如果不執(zhí)行刷新緩存會(huì)出現(xiàn)臟讀 默認(rèn)為 true,默認(rèn)情況下為 true 即刷新緩存,一般不用修改。三.Mybatis 的一級(jí)緩存和二級(jí)緩存執(zhí)行順序
一句話:緩存執(zhí)行順序是:二級(jí)緩存-->一級(jí)緩存-->數(shù)據(jù)庫
當(dāng)我們關(guān)閉一級(jí)緩存的時(shí)候,如果你配置二級(jí)緩存,那么一級(jí)緩存的數(shù)據(jù),會(huì)放入到二級(jí)緩存 細(xì)節(jié)說明 1. 不會(huì)出現(xiàn)一級(jí)緩存和二級(jí)緩存中有同一個(gè)數(shù)據(jù)。因?yàn)槎?jí)緩存(數(shù)據(jù))是在一級(jí)緩存關(guān)閉 之后才有的2.運(yùn)行效果 , 可以看到,在一級(jí)緩存存在的情況下,依然是先查詢二級(jí)緩存,但是因?yàn)?二級(jí)緩存,沒有數(shù)據(jù), 所以命中率都是 0.0 ,
四.EhCache 緩存
1.基本介紹
1. EhCache 是一個(gè)純 Java 的緩存框架,具有快速、精干等特點(diǎn) 2. MyBatis 有自己默認(rèn)的二級(jí)緩存(前面我們已經(jīng)使用過了),但是在實(shí)際項(xiàng)目中,往往使用 的是更加專業(yè)的第三方緩存產(chǎn)品 作為 MyBatis 的二級(jí)緩存,EhCache 就是非常優(yōu)秀的緩存 產(chǎn)品可以通過一個(gè)接口找到第三方緩存庫。?
2.配置和使用 EhCache
2.1. 加入相關(guān)依賴pom.xml
<dependencies><!--引入ehcache核心庫/jar--><dependency><groupId>net.sf.ehcache</groupId><artifactId>ehcache-core</artifactId><version>2.6.11</version></dependency><!--引入需要使用的slf4j--><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-api</artifactId><version>1.7.25</version></dependency><!--引入mybatis整合ehcache庫/jar--><dependency><groupId>org.mybatis.caches</groupId><artifactId>mybatis-ehcache</artifactId><version>1.2.1</version></dependency></dependencies>2.2mybatis-config.xml 仍然打開二級(jí)緩存
<settings><!-- 開啟二級(jí)緩存,默認(rèn)就是打開 --><setting name="cacheEnabled" value="true"/> </settings>2.3加入配置文件ehcache.xml
<?xml version="1.0" encoding="UTF-8"?> <ehcache><!--diskStore:為緩存路徑,ehcache分為內(nèi)存和磁盤兩級(jí),此屬性定義磁盤的緩存位置。參數(shù)解釋如下:user.home – 用戶主目錄user.dir – 用戶當(dāng)前工作目錄java.io.tmpdir – 默認(rèn)臨時(shí)文件路徑--><diskStore path="java.io.tmpdir/Tmp_EhCache"/><!--defaultCache:默認(rèn)緩存策略,當(dāng)ehcache找不到定義的緩存時(shí),則使用這個(gè)緩存策略。只能定義一個(gè)。--><!--name:緩存名稱。maxElementsInMemory:緩存最大數(shù)目maxElementsOnDisk:硬盤最大緩存?zhèn)€數(shù)。eternal:對(duì)象是否永久有效,一但設(shè)置了,timeout將不起作用。overflowToDisk:是否保存到磁盤,當(dāng)系統(tǒng)宕機(jī)時(shí)timeToIdleSeconds:設(shè)置對(duì)象在失效前的允許閑置時(shí)間(單位:秒)。僅當(dāng)eternal=false對(duì)象不是永久有效時(shí)使用,可選屬性,默認(rèn)值是0,也就是可閑置時(shí)間無窮大。timeToLiveSeconds:設(shè)置對(duì)象在失效前允許存活時(shí)間(單位:秒)。最大時(shí)間介于創(chuàng)建時(shí)間和失效時(shí)間之間。僅當(dāng)eternal=false對(duì)象不是永久有效時(shí)使用,默認(rèn)是0.,也就是對(duì)象存活時(shí)間無窮大。diskPersistent:是否緩存虛擬機(jī)重啟期數(shù)據(jù) Whether the disk store persists between restarts of the Virtual Machine. The default value is false.diskSpoolBufferSizeMB:這個(gè)參數(shù)設(shè)置DiskStore(磁盤緩存)的緩存區(qū)大小。默認(rèn)是30MB。每個(gè)Cache都應(yīng)該有自己的一個(gè)緩沖區(qū)。diskExpiryThreadIntervalSeconds:磁盤失效線程運(yùn)行時(shí)間間隔,默認(rèn)是120秒。memoryStoreEvictionPolicy:當(dāng)達(dá)到maxElementsInMemory限制時(shí),Ehcache將會(huì)根據(jù)指定的策略去清理內(nèi)存。默認(rèn)策略是LRU(最近最少使用)。你可以設(shè)置為FIFO(先進(jìn)先出)或是LFU(較少使用)。clearOnFlush:內(nèi)存數(shù)量最大時(shí)是否清除。memoryStoreEvictionPolicy:可選策略(清除策略)有:LRU(最近最少使用,默認(rèn)策略)、FIFO(先進(jìn)先出)、LFU(最少訪問次數(shù))。FIFO,first in first out,這個(gè)是大家最熟的,先進(jìn)先出。LFU, Less Frequently Used,就是上面例子中使用的策略,直白一點(diǎn)就是講一直以來最少被使用的。如上面所講,緩存的元素有一個(gè)hit屬性,hit值最小的將會(huì)被清出緩存。LRU,Least Recently Used,最近最少使用的,緩存的元素有一個(gè)時(shí)間戳,當(dāng)緩存容量滿了,而又需要騰出地方來緩存新的元素的時(shí)候,那么現(xiàn)有緩存元素中時(shí)間戳離當(dāng)前時(shí)間最遠(yuǎn)的元素將被清出緩存。--><defaultCacheeternal="false"maxElementsInMemory="10000"overflowToDisk="false"diskPersistent="false"timeToIdleSeconds="1800"timeToLiveSeconds="259200"memoryStoreEvictionPolicy="LRU"/></ehcache>2.4在 XxxMapper.xml 中啟用 EhCache , 當(dāng)然原來 MyBatis 自帶的緩存配置就注銷了
<mapper namespace="com.hong.mapper.MonsterMapper"><!--1、配置二級(jí)緩存: 是mybatis自帶2、FIFO – 先進(jìn)先出:按對(duì)象進(jìn)入緩存的順序來移除它們。3. flushInterval 刷新間隔 是毫秒單位 60000 表示 60s4. size="512": 引用數(shù)目, 屬性可以被設(shè)置為任意正整數(shù), 默認(rèn)1024(預(yù)存對(duì)象的大小和運(yùn)行環(huán)境中可用的內(nèi)存資源)5. readOnly="true": (只讀)屬性可以被設(shè)置為 true 或 false: 如果我們只是用于讀操作,建議設(shè)置成 true, 這樣可以提示效率, 如果有修改操作,設(shè)置成 false, 默認(rèn)就是false--> <!-- <cache eviction="FIFO" flushInterval="60000"--> <!-- size="512" readOnly="true"/>--><!--配置/啟用ehcache--><cache type="org.mybatis.caches.ehcache.EhcacheCache"/>2.5測(cè)試
//測(cè)試ehCache級(jí)緩存@Testpublic void ehCacheTest() {//查詢id=3的monsterMonster monster = monsterMapper.getMonsterById(3);//會(huì)發(fā)出SQL, 到db查詢System.out.println("monster=" + monster);//這里老師關(guān)閉sqlSession, 一級(jí)緩存[數(shù)據(jù)]失效.=> 將數(shù)據(jù)放入到二級(jí)緩存 (ehcache)if (sqlSession != null) {sqlSession.close();}//重新獲取sqlSessionsqlSession = MyBatisUtils.getSqlSession();//重新獲取了monsterMappermonsterMapper = sqlSession.getMapper(MonsterMapper.class);//再次查詢id=3的monsterSystem.out.println("--雖然前面關(guān)閉了sqlSession,因?yàn)榕渲枚?jí)緩存(ehcache), " +"當(dāng)你再次查詢相同的id時(shí), 不會(huì)再發(fā)出sql, 而是從二級(jí)緩存(ehcache)獲取數(shù)據(jù)----");Monster monster2 = monsterMapper.getMonsterById(3);System.out.println("monster2=" + monster2);//再次查詢id=3的monster, 仍然到二級(jí)緩存(ehcache), 獲取數(shù)據(jù), 不會(huì)發(fā)出sqlMonster monster3 = monsterMapper.getMonsterById(3);System.out.println("monster3=" + monster3);if (sqlSession != null) {sqlSession.close();}3.EhCache 緩存-細(xì)節(jié)說明
如何理解 EhCache 和 MyBatis 緩存的關(guān)系 1. MyBatis 提供了一個(gè)接口 Cache【如右圖,找到 org.apache.ibatis.cache.Cache ,關(guān)聯(lián)源 碼包就可以看到 Cache 接口】 2. 只要實(shí)現(xiàn)了該 Cache 接口,就可以作為二級(jí)緩存產(chǎn)品和 MyBatis 整合使用,Ehcache 就 是實(shí)現(xiàn)了該接口 3. MyBatis 默認(rèn)情況(即一級(jí)緩存)是使用的 PerpetualCache 類實(shí)現(xiàn) Cache 接口的,是核心類4. 當(dāng)我們使用了 Ehcahce 后,就是 EhcacheCache 類實(shí)現(xiàn) Cache 接口的,是核心類.?
5. 我們看一下源碼,發(fā)現(xiàn)緩存的本質(zhì)就是 Map<Object,Object>?
總結(jié)
以上是生活随笔為你收集整理的MyBatis---缓存-提高检索效率的利器的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 计算机辅助教学是人工智能应用,人工智能技
- 下一篇: 脏标记概述