mybatis快取的使用

2021-10-14 02:06:38 字數 3576 閱讀 1504

mybatis的快取分為一級快取和二級快取,預設情況下只開啟了一級快取。

一級快取

listfindall();

}

<?xml version="1.0" encoding="utf-8" ?>

同乙個sqlsession

同乙個sqlsession,引數和sql完全一樣的情況下,第一次請求會執行sql語句並快取執行結果,再次請求就不會再次執行sql,而是從快取結果中獲取結果,當然前提是快取沒有過期。

@test

public void testfindall()

輸出:第1次查詢

debug [main] - ==> preparing: select * from user

debug [main] - ==> parameters:

trace [main] - <== columns: id, username, password

trace [main] - <== row: 1, lisi, 123

debug [main] - <== total: 1

[user]

第2次查詢

[user]

從輸出我們可以看出,第二次查詢並沒有執行sql,如果還是不確定,可以在第一次查詢結束後,休眠10秒,在休眠的這段時間我們手動去修改一下資料,你會發現就算資料庫中的資料修改了,第二次查詢依然還是原來的資料,再次印證了第二次沒有執行sql查詢而是使用了快取。

不同的sqlsession

在同乙個sqlsession的情況下,會出現使用快取的現象,哪如果是不同的sqlsession呢?

@test

public void testfindall2() throws interruptedexception

輸出:第1次查詢

debug [main] - ==> preparing: select * from user

debug [main] - ==> parameters:

trace [main] - <== columns: id, username, password

trace [main] - <== row: 1, lisi, 123

debug [main] - <== total: 1

[user]

第2次查詢

debug [main] - ==> preparing: select * from user

debug [main] - ==> parameters:

trace [main] - <== columns: id, username, password

trace [main] - <== row: 1, lisi, 123

debug [main] - <== total: 1

[user]

從輸出我們可以看出不同的sqlsession的兩次查詢,沒有使用快取,每次都執行了sql語句。

重新整理快取

重新整理快取是清空這個sqlsession的所有快取。

<?xml version="1.0" encoding="utf-8" ?>

select * from user

@test

public void testfindall()

輸出:第1次查詢

debug [main] - ==> preparing: select * from user

debug [main] - ==> parameters:

trace [main] - <== columns: id, username, password

trace [main] - <== row: 1, lisi, 123

debug [main] - <== total: 1

[user]

第2次查詢

debug [main] - ==> preparing: select * from user

debug [main] - ==> parameters:

trace [main] - <== columns: id, username, password

trace [main] - <== row: 1, lisi, 123

debug [main] - <== total: 1

[user]

從輸出結果中我們可以看到,第二次查詢並沒有使用快取,也就是不存在快取。

一級快取的實現原理

在同乙個sqlsession中,mybatis會把執行的方法和引數通過演算法生成快取的key, 然後key和結果儲存到乙個map中

下次查詢的時候,如果快取中有就是用快取中的,沒有就去資料庫查詢並放入快取中

清空快取實際就是清空map中的資料

二級快取

一級快取是sqlsession級別的,如果想要多個sqlsession共享快取,就需要開啟二級快取,二級快取預設是關閉的。

開啟二級快取

在mybatis.xml全域性配置檔案中全域性開啟二級快取

<?xml version="1.0" encoding="utf-8" ?>

pojo必須是可序列化的
public class user implements serializable
測試
@test

public void testfindall() throws interruptedexception

輸出:第1次查詢

debug [main] - ==> preparing: select * from user

debug [main] - ==> parameters:

trace [main] - <== columns: id, username, password

trace [main] - <== row: 1, lisi, 123

debug [main] - <== total: 1

[user]

第2次查詢

[user]

兩次查詢使用了不同過的sqlsession,第二次查詢沒有執行sql,使用了二級快取。

要不要使用二級快取

要不要使用二級快取,先了解下二級快取使用的注意事項

快取是以namespace為單位的,不同namespace下的操作互不影響

insert,update,delete操作會清空所在namespace下的全部快取

多表操作一定不要使用二級快取,因為多表操作進行更新操作,一定會產生髒資料

如果你覺得上面的要求你都滿足,那麼就可以使用二級快取。

快取使用流程

先查詢二級快取,有就使用

如果二級快取沒有就查詢一級快取

如果一級快取有就用,沒有就執行sql查詢資料庫

mybatis快取的使用

很久沒寫關於技術方面的文章了,今天分享一下mybatis關於快取方面的技術,個人覺得還是挺好用的,主要是xml配置方面東西,廢話不多說,我們之間上正題。當時想的很簡單,以為在查詢方法的xml配置檔案配置一下usercache true 就可以了,那時候別提有多歡喜了,mybatis的快取這麼簡單,哇...

Mybatis 的使用 7 快取

l mybatis一級快取預設存在的,不需要配置 l 一級快取的生命週期為session的生命週期,如果session關閉,一級快取消失 l 一級快取,儲存的是物件的位址 第一步 在sqlmapconfig.xml中開啟二級快取功能 第二步 在sql對映檔案中使用標籤,指定當前檔案中的sql語句可以...

hibernate快取,mybatis快取詳解

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