Mybatis全解 07 快取

2022-09-14 20:15:23 字數 3651 閱讀 2715

快取

什麼是快取

存在記憶體中的資料。將使用者經常查詢的資料放在快取(記憶體)中,使用者去查詢資料就不用每次都從磁碟上查詢,可一衝快取中查詢,從而提高查詢的效率,解決了高併發系統的效能問題。

為什麼要使用快取

減少和資料庫的互動次數,較少系統開銷,提高系統效率。

哪些資料可一使用快取

經常查詢並且不經常改變的資料。

mybatis快取

可以非常方便地定製和配置快取,極大的提公升查詢的效率。

mybatis系統中預設定義了兩級快取:一級快取和二級快取。

在預設的情況下,只有一級快取開啟(sqlsession級別的快取,也稱為本地快取)。二級快取需要手動開啟和配置,它是基於namespace級別的快取。為了提高擴充套件性,mybatis定義了快取介面cache,我們可以通過實現cache介面來自定義二級快取。

一級快取

一級快取也叫本地快取,與資料庫同一次會話期間查詢到的資料會放在本地快取中,後面如果需要獲取相同的資料,直接從快取中拿,沒必要再去查詢資料庫。

編寫測試環境:注意開啟日誌觀察輸出

//

根據id查詢使用者

user queryuserbyid(@param("id") int id);

select * from user where id =#

@test

public

void

testqueryuserbyid()

觀察日誌輸出可以看到,兩次的查詢的user物件是同乙個。

一級快取失效的四種情況

一級快取是sqlsession級別的快取,是一直開啟的,我們關閉不了它。

1.第一種失效情況:sqlsession不同。

@test

public

void

testqueryuserbyid()

觀察日誌輸出可發現,一共傳送了兩條sql語句

結論:每個sqlsession中的快取相互獨立。

2.第二種失效情況:sqlsession相同,查詢條件不同

@test

public

void

testqueryuserbyid()

觀察日誌輸出可發現,一共傳送了兩條sql語句

結論:不同的查詢條件,當前快取中不存在第二次查詢的資料

3.第三種失效的情況:sqlsession相同,兩次查詢之間執行了增刪改操作

@test

public

void

testqueryuserbyid()

觀察日誌輸出可發現,查詢在中間執行了增刪改操作後,重新執行了

結論:增刪改操作會對當前資料產生影響

4.第四種失效情況:手動清除一級快取,session.clearcache();

@test

public

void

testqueryuserbyid()

一級快取就是乙個map。

二級快取

二級快取也叫全域性快取,一級快取作用域太低了,所以誕生了二級快取。基於namespace級別的快取,乙個命名空間,對應乙個二級快取。

工作機制

使用二級快取步驟

1.在mybatis核心配置檔案中開啟二級快取

<

setting

name

="cacheenabled"

value

="true"

/>

<

cache

/>

官方示例*****>檢視官方文件

<

cache

eviction

="fifo"

flushinterval

="60000"

size

="512"

readonly

="true"

/>

這個更高階的配置建立了乙個 fifo 快取,每隔 60 秒重新整理,最多可以儲存結果物件或列表的 512 個引用,而且返回的物件被認為是唯讀的,因此對它們進行修改可能會在不同執行緒中的呼叫者產生衝突。

3.測試

@test

public

void

testqueryuserbyid()

擴充套件:第三方快取實現-ehcache

ehcache是一種廣泛使用的j**a分布式快取,用於通用快取;

使用步驟

1.匯入jar包

org.mybatis.caches

mybatis-ehcache

1.1.0

<

namespace

>

<

cache

type

= 「org.mybatis.caches.ehcache.ehcachecache」

/>

>

3.編寫ehcache.xml檔案,如果在載入時未找到/ehcache.xml資源或出現問題,則將使用預設配置。

<?

xml version="1.0" encoding="utf-8"

?>

<

ehcache

xmlns:xsi

=""xsi:nonamespaceschemalocation

=""updatecheck

="false"

>

<

diskstore

path

="./tmpdir/tmp_ehcache"

/>

<

defaultcache

eternal

="false"

maxelementsinmemory

="10000"

overflowtodisk

="false"

diskpersistent

="false"

timetoidleseconds

="1800"

timetoliveseconds

="259200"

memorystoreevictionpolicy

="lru"

/>

<

cache

name

="cloud_user"

eternal

="false"

maxelementsinmemory

="5000"

overflowtodisk

="false"

diskpersistent

="false"

timetoidleseconds

="1800"

timetoliveseconds

="1800"

memorystoreevictionpolicy

="lru"

/>

ehcache

>

寫在最後

熟悉使用快取來儲存資料,提公升程式效能。

Mybatis全解 04 使用註解開發

使用註解開發 先學習思想 面向介面程式設計 為什麼要面向介面程式設計?根本原因 解耦,可拓展,提高復用,分層開發中,上層不用管具體的實現,大家遵守共同的標準,使得開發變得容易,規範性更好。關於介面的理解 定義 規範 約束 與實現 名實分離原則 的分離。介面的本身反映了系統設計人員對系統的抽象理解。介...

hibernate快取,mybatis快取詳解

hibernate的快取有一級快取,二級快取,查詢快取。一級快取 很簡單,session級別的快取,通過get,update可以將物件放到一級快取中。二級快取 sessionfactory級別的快取,通過get,list可以將物件放到二級快取中,這裡我必須細講一下,list雖然能夠把物件放入二級快取...

Mybatis 三 Mybatis快取配置

強烈推薦乙個大神的人工智慧的教程 使用快取可以提高獲取資料的速度,避免頻繁的資料庫互動,尤其是在查詢越多,快取命中率越高的情況下,使用快取的作用就更加明顯了。一般提到mybatis快取的時候都是指二級快取,一級快取缺省會啟用。catch ioexception ignore public sqlse...