Mybatis緩存介紹
使用緩存可以避免與數(shù)據(jù)庫頻繁交互,從而減少數(shù)據(jù)庫的壓力,并且提升查詢效率。Mybatis提供了一級(jí)緩存和二級(jí)緩存,并且預(yù)留了集成第三方緩存的接口。
Mybatisd的cache包內(nèi)包含了與緩存相關(guān)的類,其中有一個(gè)Cache接口,它有一個(gè)默認(rèn)的實(shí)現(xiàn)類PerpetualCache,是一個(gè)用HashMap實(shí)現(xiàn)的本地緩存。
一級(jí)緩存
一級(jí)緩存也叫本地緩存,Mybatis默認(rèn)開啟了一級(jí)緩存。一級(jí)緩存的作用域?yàn)镾qlSession,就是說同一個(gè)SqlSession對(duì)象,在參數(shù)和sql完全一樣的情況下,只執(zhí)行一次sql語句,第一次執(zhí)行完畢會(huì)將結(jié)果寫入緩存中,第二次會(huì)直接從緩存中獲取數(shù)據(jù)而不再到數(shù)據(jù)庫中查詢。
一級(jí)緩存的生命周期
- Mybatis開啟一個(gè)數(shù)據(jù)庫會(huì)話時(shí),會(huì)創(chuàng)建一個(gè)新的SqlSession對(duì)象,SqlSession對(duì)象中有一個(gè)Executor對(duì)象持有一個(gè)新的PerpetualCache對(duì)象,這個(gè)PerpetualCache對(duì)象維持的一級(jí)緩存。
- SqlSession的close()方法被調(diào)用時(shí),會(huì)釋放PerpetualCache對(duì)象,一級(jí)緩存即不可用。
- SqlSession的clearCache()方法會(huì)清空PerpetualCache對(duì)象中的數(shù)據(jù),此時(shí)緩存為空,但該對(duì)象仍可用。
- 當(dāng)SqlSession執(zhí)行了update()、delete()、insert()操作時(shí),由于數(shù)據(jù)可能發(fā)生改變,因此也會(huì)清空PerpetualCache對(duì)象。
- 當(dāng)一個(gè)SqlSession結(jié)束時(shí),SqlSession對(duì)象及其內(nèi)部的Executor對(duì)象以及PerpetualCache對(duì)象全部被釋放。
一級(jí)緩存的實(shí)現(xiàn)
- 在一個(gè)SqlSession中,Mybatis會(huì)把執(zhí)行的查詢方法和參數(shù)通過算法生成緩存的key鍵,通過這個(gè)key鍵在緩存的Map中獲取數(shù)據(jù)。
- 如果key鍵對(duì)應(yīng)的value值為空,則去數(shù)據(jù)庫中查詢數(shù)據(jù),并將數(shù)據(jù)作為value值存入key鍵對(duì)應(yīng)的緩存Map中。
- 如果key鍵對(duì)應(yīng)的value值不為空,則直接返回value值。
二級(jí)緩存
由于一級(jí)緩存是session級(jí)別的緩存,不同會(huì)話不能共享緩存,因此,不同會(huì)話之間對(duì)于相同的數(shù)據(jù)可能有不一樣的緩存,會(huì)存在臟數(shù)據(jù)的問題。二級(jí)緩存存在于SqlSessionFactory生命周期中,作用范圍是namespace級(jí)別的,它解決了緩存的跨會(huì)話共享的問題。在執(zhí)行查詢時(shí),Mybatis會(huì)先從二級(jí)緩存中取值,其次才是一級(jí)緩存,都未命中才去數(shù)據(jù)庫查詢。
二級(jí)緩存的配置
二級(jí)緩存需要配置。由于增刪改操作會(huì)刷新緩存,因此在查詢?yōu)橹鞯膽?yīng)用中配置二級(jí)緩存才有意義。
- Mybatis中二級(jí)緩存有一個(gè)全局開關(guān),即配置cacheEnabled,默認(rèn)為true。
- 在全局配置開啟的情況下,在單個(gè)mapper.xml中添加
<cache/>標(biāo)簽即開啟了此mapper的namespace下的二級(jí)緩存。
二級(jí)緩存的特點(diǎn)
- Mybatis中的二級(jí)緩存作用于mapper范圍級(jí)別
- 二級(jí)緩存是事務(wù)性的,事務(wù)提交后才會(huì)將數(shù)據(jù)寫入二級(jí)緩存
- 增刪改操作會(huì)清空緩存