查詢快取主要是為了提高查詢訪問速度,即當使用者執行一次查詢後,會將該資料結果放到快取中,當下次再執行此查詢時就不會訪問資料庫了而是直接從快取中獲取該資料。 如果在快取中找到了資料那叫做命中。
同一sqlsession 多次查詢同一sql時會使用快取
@test
public void testlocalcache() throws exception
複製**
同一sqlsession 有增刪改時會清空快取
@test
public void testlocalcacheclear() throws exception
複製**
對sqlsession的操作mybatis內部都是通過executor來執行的。executor的生命週期和sqlsession是一致的。mybatis在executor中建立了一級快取,基於perpetualcache 類的 hashmap
public class defaultsqlsession implements sqlsession
public abstract class baseexecutor implements executor
}// 快取實現類
public class perpetualcache implements cache
}複製**
會呼叫此方法(一級快取操作,總是先查詢一級快取,快取中不存在再查詢資料庫)
errorcontext.instance().resource(ms.getresource()).activity("executing a query").object(ms.getid());
if (closed)
//先清一級快取,再查詢,但僅僅查詢堆疊為0才清,為了處理遞迴呼叫
if (querystack == 0 && ms.isflushcacherequired())
listlist;
try else
} finally
if (querystack == 0)
deferredloads.clear(); //清空延遲載入佇列
if (configuration.getlocalcachescope() == localcachescope.statement)
}return list;
}複製**
localcache 快取的key 為cachekey物件 cachekey:statementid+rowbounds+ 傳遞給jdbc的sql+ 傳遞給jdbc的引數值if (closed)
cachekey cachekey = new cachekey();
cachekey.update(ms.getid());
cachekey.update(rowbounds.getoffset());
cachekey.update(rowbounds.getlimit());
cachekey.update(boundsql.getsql());
typehandlerregistry typehandlerregistry = ms.getconfiguration().gettypehandlerregistry();
// mimic defaultparameterhandler logic
object value;
if (boundsql.hasadditionalparameter(propertyname)) else if (parameterobject == null) else if (typehandlerregistry.hastypehandler(parameterobject.getclass())) else
cachekey.update(value);}}
if (configuration.getenvironment() != null)
return cachekey;
}複製**
sqlsession關閉後才會將資料寫到二級快取區域
增刪改操作,無論是否進行提交commit(),均會清空一級、二級快取
二級快取是預設開啟的。
如果想要設定增刪改操作的時候不清空二級快取的話,可以在其insert或delete或update中新增屬性flushcache=」false」,預設為 true。
delete from t_student where id=#
複製**
// mybatis-config.xml 中配置
預設值為 true。即二級快取預設是開啟的
type:指定cache介面的實現類的型別,mybatis預設使用perpetualcache
要和ehcache整合,需要配置type為ehcache實現cache介面的型別-->
複製**
@test
public void testcachewithcommitorclose() throws exception
複製**
@test
public void testcachewithoutcommitorclose() throws exception
複製**
複製**
複製** mybatis快取機制
mybatis和hibernate一樣,也提供了一二級快取。若存在一二級快取,則資料不會去資料庫互動,而是去記憶體中獲取。一級快取是sqlsession級別的快取。在運算元據庫時需要構造sqlsession物件,在物件中有乙個資料結構 一般來說是hashmap 來儲存快取資料。不同的sqlsessi...
MyBatis 快取機制
mybatis 提供了查詢快取來獲取資料,以提高查詢的效能。mybatis 的快取分為一級快取和二級快取。1 一級快取一級快取是 sqlsession 級別的快取,是基於 hashmap 的本地快取。不同的 sqlsession 之間的快取資料區域互不影響。當同乙個 sqlsession 執行兩次相...
mybatis快取機制
一 一級快取 本地快取預設開啟 sqlsession級別的快取。一級快取是一直開啟的,無法關閉。sqlsession級別的乙個map 與資料庫同義詞會話期間查詢到的資料會放到本地快取中。以後如果需要獲取相同的資料,直接從快取中拿,沒有必要再去查詢資料庫。1.一級快取失效情況 沒有使用到當前一級快取的...