二級快取的原理和一級快取的原理一樣,第一次查詢,會將資料放入快取中,然後第二次查詢則會直接從快取中取資料。
實體類必須實現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 顯示的記錄數 引數的資料型別選...