MyBatis 10 MyBatis 二級快取

2021-10-23 06:47:47 字數 4250 閱讀 7980

二級快取的原理和一級快取的原理一樣,第一次查詢,會將資料放入快取中,然後第二次查詢則會直接從快取中取資料。

實體類必須實現serializabel介面

public

class

user

implements

serializable

開啟二級快取後,還需要將快取的實體類實現serializabel介面,為了將快取資料取出執行反序列化操作,因為二級快取資料儲存介質多種多樣,不一定只儲存在記憶體中,也有可能存在硬碟中,如果我們要再取出這個快取的話,就需要反序列了。

>

name

="localcachescope"

value

="statement"

/>

name

="cacheenabled"

value

="true"

/>

name

="logimpl"

value

="stdout_logging"

/>

settings

>

@cachenamespace

public

inte***ce")

user findbyid

(integer id)

;/**

* 更新使用者

*/@update

("update user set username = # where id = #"

)void

updateuser

(user user)

;}

user 實體類:

public

class

user

implements

serializable

測試類

public

class

cachetest

@test

public

void

secondlevelcache()

}

輸出結果:

==>  preparing: select * from user where id = ? 

==> parameters: 1(integer)

<== columns: id, username

<== row: 1, 原始資料

<== total: 1

resetting autocommit to true on jdbc connection [com.mysql.jdbc.jdbc4connection@7e3b2171]

closing jdbc connection [com.mysql.jdbc.jdbc4connection@7e3b2171]

returned connection 2117804401 to pool.

false

opening jdbc connection

checked out connection 2117804401 from pool.

setting autocommit to false on jdbc connection [com.mysql.jdbc.jdbc4connection@7e3b2171]

==> preparing: update user set username = ? where id = ?

==> parameters: 二級快取修改(string), 1(integer)

<== updates: 1

上面我們介紹了mybatis自帶的二級快取,但是這個快取是單伺服器工作的,無法實現分布式快取。

為了解決這個問題,我們可以找乙個分布式的快取,專門用來儲存資料的,我們這裡使用比較流行的redis

mybatis提供了乙個cache介面,如果要實現自己的快取邏輯,實現cache介面開發即可。

mybatis 本身預設實現了乙個,但是這個快取的實現無法實現分布式快取,所以我們可以用redis實現分布式快取。mybatis提供了乙個redis快取實現類,在mybatis-redis包中

配置redis

在resource新建redis.properties

redis.host=localhost

redis.port=6379

redis.connectiontimeout=5000

redis.password=

redis.database=0

測試

@test

public

void

secondlevelcache()

輸出:

==>  preparing: select * from user where id = ? 

==> parameters: 1(integer)

<== columns: id, username

<== row: 1, 原始資料

<== total: 1

resetting autocommit to true on jdbc connection [com.mysql.jdbc.jdbc4connection@3c0e6184]

closing jdbc connection [com.mysql.jdbc.jdbc4connection@3c0e6184]

returned connection 1007575428 to pool.

false

opening jdbc connection

checked out connection 1007575428 from pool.

setting autocommit to false on jdbc connection [com.mysql.jdbc.jdbc4connection@3c0e6184]

==> preparing: update user set username = ? where id = ?

==> parameters: 二級快取修改(string), 1(integer)

<== updates: 1

可以看到,cache hit ratio顯示使用了快取,同時檢視redis

也能取出儲存的物件的值

rediscache 和大家普遍實現的mybatis的快取方案大同小異,無非是實現cache介面,並使用jedis操作快取;不過該專案在設計細節上有一些區別

public

final

class

rediscache

implements

cache

this

.id = id;

redisconfig redisconfig = redisconfigurationbuilder.

getinstance()

.parseconfiguration()

; pool =

newjedispool

(redisconfig, redisconfig.

gethost()

, redisconfig.

getport()

, redisconfig.

getconnectiontimeout()

, redisconfig.

getsotimeout()

, redisconfig.

getpassword()

, redisconfig.

getdatabase()

, redisconfig.

getclientname()

);}...}

MyBatis原始碼閱讀 解析MyBatis執行流程

前言 從demo分析上層流程 sqlsessionfactory sqlsessionfactory 一旦被建立就應該在應用的執行期間一直存在,沒有任何理由對它進行清除或重建。使用 sqlsessionfactory 的最佳實踐是在應用執行期間不要重複建立多次,多次重建 sqlsessionfact...

Mybatis 10模糊匹配

需求 查詢student表,表中含有 王 的所有使用者 sql select from student where sname like 王 方式1 直接在引數上拼接萬用字元 test public void getstudentbyname 日誌列印 方法3 bind表示式處理 mybatis提供...

Mybatis 10 實現分頁 分頁外掛程式

也就是說,在查詢結果的最後控制返回的起始位置 記錄數量 引數1 返回的開始位置 引數2 要返回的記錄數 但是,如果說是只寫了乙個引數,直接表示引數2處理 limit start index size 實際開發不會只寫乙個引數,使用者預設開啟一定是從第一條開始的 即 0 顯示的記錄數 引數的資料型別選...