Mybatis的一級快取和二級快取的理解以及用法

2021-10-08 17:07:13 字數 3438 閱讀 9874

程式中為什麼使用快取?

先了解一下快取的概念:原始意義是指訪問速度比一般隨機訪問儲存器快的一種ram,通常它不像系統主存那樣使用dram技術,而使用昂貴但較快速的sram技術。對於我們程式設計來說,所謂的快取,就是將程式或系統經常要呼叫的物件(臨時資料)存在記憶體中,以便其使用時可以快速呼叫,不必再去建立新的重複的例項。這樣做可以減少系統的開銷,提高效率。

對快取有了一定的了解以後就知道了使用快取是為了減少和資料庫的互動次數,提高執行效率。那麼下乙個問題來了,什麼樣的資料能使用快取,什麼樣的資料不能使用呢?

這是我們使用快取必須要明確的事情,實際上適用於快取的資料指:經常查詢並且不經常改變的,並且資料的正確與否對最終結果影響不大的,不適用於快取的資料:經常改變的資料,資料的正確與否對最終結果影響很大的。

mybatis中的一級快取和二級快取到底快取了什麼,快取了以後又有什麼效果,快取的資料什麼時候會被清空?

一級快取:它指的是mybatis中sqlsession物件的快取,當我們執行查詢以後,查詢的結果會同時存入到sqlsession中為我們提供的一塊區域中,該區域的結構是乙個map,當我們再次查詢同樣的資料,mybatis會先去sqlsession中查詢是否有,有的話直接拿出來用,當sqlsession物件消失時,mybatis的一級快取也就消失了,同時一級快取是sqlsession範圍的快取,當呼叫sqlsession的修改、新增、刪除、commit(),close等方法時,就會清空一級快取。

二級快取:他指的是mybatis中sqlsessionfactory物件的快取,由同乙個sqlsessionfactory物件建立的sqlsession共享其快取,但是其中快取的是資料而不是物件,所以從二級快取再次查詢出的結果物件與第一次存入的物件是不一樣的。

通過簡單的例子來加深理解一級快取和二級快取。

一級快取

1.使用者類

public

class

user

implements

serializable

2.dao層

public

inte***ce

userdao

3.userdao.xml對映檔案

"com.example.dao.userdao"

>

"findall" resulttype=

"com.example.domain.user"

>

select * from user;

<

/select>

"findbyid" resulttype=

"com.example.domain.user" parametertype=

"int"

>

select * from user where id = #

<

/select>

"updateuser" parametertype=

"com.example.domain.user"

>

update user

<

if test=

"username != null"

>username=#

,>

<

if test=

"password != null"

>birthday=#

,>

<

if test=

"*** != null"

>***=#

,>

<

if test=

"address != null"

>address=#

,>

<

/set>

where id=#

<

/update>

<

在以上三步中這是mybatis的單錶操作,下面通過根據使用者id查詢使用者的操作來觀察一級快取生效與否的區別  

4.測試

(1) 命中一級快取的情況

測試**:

@test
public

void

findbyidtest()

測試結果:

(2)對sqlsession進行清除快取的操作,即清楚一級快取,然後再次進行測試。

@test
public

void

findbyidtest()

清空快取的操作很多,可以都試試。測試結果:

二級快取  

再看一下mybatis二級快取是如何使用的,第一步讓mybatis框架支援二級快取(在mybatis的主配置檔案中配置),第二步讓當前的對映檔案支援二級快取(在dao.xml對映檔案中配置),第三步讓當前的方法支援二級快取(在標籤中配置)。根據這個步驟將上面的查詢使用者的介面通過配置改造為可以支援二級快取的方法。

1.配置mybatis框架支援二級快取

"cacheenabled" value=

"true"

/>

2.配置userdao.xml支援二級快取

>

3.配置查詢的方法支援二級快取

"findbyid" resulttype=

"com.example.domain.user" parametertype=

"int" usecache=

"true"

>

select * from user where id = #

<

/select>

4.測試

@test

public

void

findbyidtest()

測試結果:

總結:mybatis的的一級快取是sqlsession級別的快取,一級快取快取的是物件,當sqlsession提交、關閉以及其他的更新資料庫的操作發生後,一級快取就會清空。二級快取是sqlsessionfactory級別的快取,同乙個sqlsessionfactory產生的sqlsession都共享乙個二級快取,二級快取中儲存的是資料,當命中二級快取時,通過儲存的資料構造物件返回。查詢資料的時候,查詢的流程是二級快取》一級快取》資料庫。

mybatis 快取(一級和二級快取)

1.快取 好處 快取的使用演示 1 sql語句或查詢條件不同 2 分屬不同sqlsession物件 3 查詢前執行clearcache 4 提交事務 2.一級快取 3.二級快取 跟 web應用中 物件作用範圍類似。cacheenabled value true flushinterval 快取重新整...

Mybatis 一級快取和二級快取

一級快取是sqlsession級別的快取 工作機制 乙個sqlsession就代表和資料庫的一次會話,在資料庫中查出的資料放在一級快取中,同乙個物件再次查詢時,會去快取中查詢,避免了再次查詢資料庫。使用 mybatis預設開啟,不需要手動設定 舉例 同乙個物件,查詢兩次,只呼叫一次sql 注 所有測...

mybatis 快取(一級和二級快取)

1.快取 好處 快取的使用演示 1 sql語句或查詢條件不同 2 分屬不同sqlsession物件 3 查詢前執行clearcache 4 提交事務 2.一級快取 3.二級快取 flushinterval 快取重新整理時間間隔,時間是毫秒,檢查是否存在過期物件 size 快取中儲存的物件個數 rea...