MyBatis學習8 MyBatis中的二級快取

2021-08-15 09:50:12 字數 2414 閱讀 2586

sqlsession2去查詢使用者id為1的使用者資訊,去快取中找是否存在資料,如果存在直接從快取中取出資料。

明白了mybatis中二級快取的原理後,接下來就是如何使用二級快取了。在使用之前,首先得開啟二級快取的開關。

開啟了二級快取後,還需要將要快取的pojo實現serializable介面,為了將快取資料取出執行反序列化操作,因為二級快取資料儲存介質多種多樣,不一定只存在記憶體中,有可能存在硬碟中,如果我們要再取這個快取的話,就需要反序列化了。所以建議mybatis中的pojo都去實現serializable介面。下面以user為例截個圖: 

@test

public

void

testcache2() throws exception

我們先把sqlsession3部分注釋掉來測試一下二級快取的結果: 

當我們把sqlsession3部分加上後,再測試一下二級快取結果: 

到這裡,就明白了mybatis中二級快取的執行原理了,這個跟hibernate還是有點像的。也可以對照著我寫的hibernate的二級快取的博文看(不過建議把下面的ehcache部分看完再對照hibernate看)。

mybatis中還可以配置usercache和flushcache等配置項,usercache是用來設定是否禁用二級快取的,在statement中設定usecache=false可以禁用當前select語句的二級快取,即每次查詢都會發出sql去查詢,預設情況是true,即該sql使用二級快取。

id="findorderlistresultmap"

resultmap="ordersusermap"

usecache="false">

id="insertuser"

parametertype="cn.itcast.mybatis.po.user"

flushcache="true">

一般下執行完commit操作都需要重新整理快取,flushcache=true表示重新整理快取,這樣可以避免資料庫髒讀。所以我們不用設定,預設即可,這裡只是提一下。

上面的部分主要總結了一下mybatis中二級快取的使用,但是mybatis中預設自帶的二級快取有個弊端,即無法實現分布式快取,什麼意思呢?就是說快取的資料在自己的伺服器上,假設現在有兩個伺服器a和b,使用者訪問的時候訪問了a伺服器,查詢後的快取就會放在a伺服器上,假設現在有個使用者訪問的是b伺服器,那麼他在b伺服器上就無法獲取剛剛那個快取,如下圖所示: 

所以我們為了解決這個問題,就得找乙個分布式的快取,專門用來儲存快取資料的,這樣不同的伺服器要快取資料都往它那裡存,取快取資料也從它那裡取,如下圖所示: 

這樣就能解決上面所說的問題,為了提高系統併發效能、我們一般對系統進行上面這種分布式部署(集群部署方式),所以要使用分布式快取對快取資料進行集中管理。但是mybatis無法實現分布式快取,需要和其它分布式快取框架進行整合,這裡主要介紹ehcache。

xmlns:xsi=""

xsi:nonamespaceschemalocation="../config/ehcache.xsd">

path="f:\develop\ehcache"/>

maxelementsinmemory="10000"

eternal="false"

timetoidleseconds="120"

timetoliveseconds="120"

maxelementsondisk="10000000"

diskexpirythreadintervalseconds="120"

memorystoreevictionpolicy="lru">

strategy="localtempswap"/>

defaultcache>

ehcache>

這裡面配置的作用跟hibernate差不多,大家可以去參考我那篇hibernate二級快取的博文。接下來就是測試了,還是用上面的那個測試程式,因為只改掉了快取,其他沒動。到此為止,mybatis的二級快取差不多就總結完了。

—–樂於分享,共同進步! 

—–我的部落格主頁:

MyBatis學習總結 七 Mybatis快取

正如大多數持久層框架一樣,mybatis 同樣提供了一級快取和二級快取的支援 一級快取 基於perpetualcache 的 hashmap本地快取,其儲存作用域為session,當session flush 或 close之後,該session中的所有 cache 就將清空。2.二級快取,如 eh...

MyBatis學習總結 七 Mybatis快取

正如大多數持久層框架一樣,mybatis 同樣提供了一級快取和二級快取的支援 一級快取 基於perpetualcache 的 hashmap本地快取,其儲存作用域為session,當session flush 或 close之後,該session中的所有 cache 就將清空。2.二級快取,如 eh...

MyBatis學習總結 七 Mybatis快取

只為成功找方法,不為失敗找藉口!正如大多數持久層框架一樣,mybatis 同樣提供了一級快取和二級快取的支援 一級快取 基於perpetualcache 的 hashmap本地快取,其儲存作用域為session,當session flush 或 close之後,該session中的所有 cache ...