ibatis快取的簡單使用和原始碼分析

2021-08-25 07:29:38 字數 1386 閱讀 1303

配置:

select * from user limit 0,#size#

測試**:

mapmap = new hashmap();

map.put("size", 8);

// first time no cache

long starttime = system.currenttimemillis();

listlist = (list)sqlmap.queryforlist("user.getall", map);

system.out.println("no cache pass time:" + (system.currenttimemillis() - starttime));

// second time has cache

map.put("size", 8);

starttime = system.currenttimemillis();

list = (list)sqlmap.queryforlist("user.getall", map);

system.out.println("has cache pass time:" + (system.currenttimemillis() - starttime));

結果:

no cache pass time:485

has cache pass time:0

開啟ibatis的日誌,會發現第二次執行沒有sql語句輸出。

注意:cachemodel快取的是statement,即key是跟sql語句相關,如果sql語句不一樣,將產生兩個cache,如第二條將使用不到快取,但第三條可以使用快取:

select * from user limit 0,4    新建快取

select * from user limit 0,8    新建快取

select * from user limit 0,8    使用快取

簡單原始碼分析:

以queryforlist為例:

sqlmapexecutordelegate具體實現:

list = ms.executequeryforlist(statementscope, trans, paramobject, skip, max);

cachingstatement具體實現:

public list executequeryforlist(statementscope statementscope, transaction trans, object parameterobject, int skipresults, int maxresults)

throws sqlexception else if (listasobject == null) else

return list;

}

IBatis 的快取機制

快取機制,也是基於 key value 的方式,確定了 key 的來龍去脈能很好的認識快取的生存週期。從配置檔案解析說起 0 1 private errorcontext errorcontext 0 2 private cachemodel cachemodel 0 3 0 4 cachemode...

ibatis的快取中計算cachekey的過程

cachingstatement在執行查詢的時候,會先從cachemodel中獲取結果。如果結果為空,則執行查詢並將結果儲存在cachemodel中。在讀寫cachemodel的過程中,都需要獲得cachekey物件,以cachekey作為快取的key。下面是獲得cachekey的過程 cachin...

mybatis和ibatis使用區別

select from userinfo where userid userid select from userinfo where userid public userinfo getuserinfo int userid 2.等元素的 parameterclass 屬性改為了 paramete...