配置:
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...