一級(jí)緩存: 也稱本地緩存,,sqlSession級(jí)別的緩存,。一級(jí)緩存是一直開(kāi)啟的;與數(shù)據(jù)庫(kù)同一次回話期間查詢到的數(shù)據(jù)會(huì)放在本地緩存中,。 如果需要獲取相同的數(shù)據(jù),,直接從緩存中拿,不會(huì)再查數(shù)據(jù)庫(kù),。 一級(jí)緩存失效的四種情況: 1.sqlSession不同,。 eg:
2.sqlSession相同,,查詢條件不同,。因?yàn)榫彺鏃l件不同,緩存中還沒(méi)有數(shù)據(jù),。 3.sqlSession相同,,在兩次相同查詢條件中間執(zhí)行過(guò)增刪改操作。(因?yàn)橹虚g的增刪改可能對(duì)緩存中數(shù)據(jù)進(jìn)行修改,,所以不能用) 4.sqlSession相同,,手動(dòng)清空了一級(jí)緩存。 eg:
二級(jí)緩存:全局緩存,;基于namespace級(jí)別的緩存。一個(gè)namespace對(duì)應(yīng)一個(gè)二級(jí)緩存,。 工作機(jī)制:1.一個(gè)會(huì)話,,查詢一條數(shù)據(jù),這個(gè)數(shù)據(jù)會(huì)被放在當(dāng)前會(huì)話的一級(jí)緩存中,。 2,如果會(huì)話被關(guān)閉了,,一級(jí)緩存中的數(shù)據(jù)會(huì)被保存帶二級(jí)緩存。新的會(huì)話查詢信息就會(huì)參照二級(jí)緩存,。 3.sqlSession ====> Employee====>employee sqlSession ====>DepartmentMapper=====>Department 不同的namespace查出的數(shù)據(jù)會(huì)放在自己對(duì)應(yīng)的緩存中,。 效果:查出的數(shù)據(jù)首先放在一級(jí)緩存中,只有一級(jí)緩存被關(guān)閉或者提交以后,,一級(jí)緩存數(shù)據(jù)才會(huì)轉(zhuǎn)移到二級(jí)緩存 使用步驟: 1.開(kāi)啟全局緩存配置,。<settings><setting name='cacheEnabled' value='true'/></settings> 2.因?yàn)槭莕amespace級(jí)別,需要搭配每個(gè)xxxMapper.xml中配置二級(jí)緩存<cache></cache> <cache flushInterval='60000' size='512' readOnly='true' eviction='FIFO' type='' /> eviction:緩存的回收策略: LRU – 最近最少使用的:移除最長(zhǎng)時(shí)間不被使用的對(duì)象,。 FIFO – 先進(jìn)先出:按對(duì)象進(jìn)入緩存的順序來(lái)移除它們,。 SOFT – 軟引用:移除基于垃圾回收器狀態(tài)和軟引用規(guī)則的對(duì)象。 WEAK – 弱引用:更積極地移除基于垃圾收集器狀態(tài)和弱引用規(guī)則的對(duì)象,。 flushInterval:緩存刷新間隔,。緩存多久清空一次,默認(rèn)不清空,。設(shè)置一個(gè)毫秒值,。 readOnly:是否只讀。true:mybatis認(rèn)為所有從緩存中獲取數(shù)據(jù)的操作都是只讀操作,,不會(huì)修改數(shù)據(jù),。 mybatis為了加快獲取速度,直接就會(huì)將數(shù)據(jù)在緩存中的引用交給用戶,。不安全,,速度快。 false:mybatis覺(jué)得獲取的數(shù)據(jù)可能被修改,。mybatis會(huì)利用序列化和反序列化的技術(shù)克隆一份新的數(shù)據(jù)給用戶,。安全,速度快,。 size:緩存放多少元素,。 type:指定自定義緩存全類名。實(shí)現(xiàn)cache接口即可,。 3.pojo需要實(shí)現(xiàn)序列換接口,。 和緩存相關(guān)的配置/屬性: 1.cacheEnabled:如果是false,關(guān)閉二級(jí)緩存,不關(guān)閉一級(jí)緩存,。 2.每個(gè)select標(biāo)簽都有userCache='true'屬性:對(duì)一級(jí)緩存沒(méi)有影響,。設(shè)置為false,二級(jí)緩存失效。 3.每個(gè)增刪改標(biāo)簽都有flushCache='true'屬性:一級(jí)緩存和二級(jí)緩存都會(huì)被清空,。 4.在查詢標(biāo)簽中flushCache='false'屬性:如果設(shè)置為true,查完會(huì)清空,,一級(jí)二級(jí)緩存都會(huì)被清空,,都不會(huì)用緩存。 5.sqlSession.clearn():跟session有關(guān),,只會(huì)清除一級(jí)緩存,。 6.localCacheScope:<settings><setting name='localCacheScope' value='SESSION'/></settings>本地緩存作用域。 一級(jí)緩存SESSION:當(dāng)前會(huì)話的所有數(shù)據(jù)保存到回話緩存中,。STATEMENT:禁用一級(jí)緩存,。
緩存首先一進(jìn)來(lái)去查二級(jí)緩存,二級(jí)緩存沒(méi)有去找一級(jí)緩存,,一級(jí)緩存沒(méi)有去找數(shù)據(jù)庫(kù),。二級(jí)緩存----->一級(jí)緩存-------->數(shù)據(jù)庫(kù)。 自定義緩存 implements Cache,重寫(xiě)接口中的保存等方法,,比如說(shuō)保存到redis. 自定義緩存參照mybatis官網(wǎng)--->項(xiàng)目git代碼庫(kù)----->https://github.com/mybatis---->參照各種整合緩存 |
|
來(lái)自: Levy_X > 《JAVAWEB學(xué)習(xí)資料》