mybatis的快取有兩種,分為一級快取和二級快取,它們的作用域不同。
一級快取我個人也叫session快取,它預設是開啟的,不可配置的。為啥叫session快取,是因為它的作用域是session範圍內的,也就是說同乙個session的情況才能使用到一級快取,目前我遇到的情況就是在乙個事務內查詢兩次資料就會使用到一級快取。所以說這個一級快取其實很坑的,基本使用不到,在分布式環境下還可能有***。
特點總結如下:
預設開啟;
快取的效果很雞肋,分布式環境還可能有***。
原始碼在baseexecutor
類下,如下:
@override
public
list
query
throws sqlexception
public
list
query
throws sqlexception
if(querystack ==
0&& ms.
isflushcacherequired()
) list
list;
tryelse
}finally
if(querystack ==0)
// issue #601
deferredloads.
clear()
;if(configuration.
getlocalcachescope()
== localcachescope.statement)
}return list;
}/**
在事務提交或者回滾的時候,會清空快取。
**/@override
public
void
commit
(boolean required)
throws sqlexception
clearlocalcache()
;flushstatements()
;if(required)
}@override
public
void
rollback
(boolean required)
throws sqlexception
finally}}
}
在事務提交或者回滾的時候,會清空快取。
原始碼分析,主要入口在org.apache.ibatis.executor.cachingexecutor
中query方法和update方法,裡面有個成員變數org.apache.ibatis.cache.transactionalcachemanager
物件,管理著org.apache.ibatis.cache.decorators.transactionalcache
事務,在事務中提交或者回滾事務都會清空對應快取,如下:
cachingexecutor類**
@override
public
intupdate
throws sqlexception
// 根據配置是否每次都重新整理快取
private
void
flushcacheifrequired
}@override
public
list
query
throws sqlexception
@override
public
list
query
throws sqlexception
return list;}}
return delegate.
query
(ms, parameterobject, rowbounds, resulthandler, key, boundsql)
;}
transactionalcache類**
@override
public
void
clear()
public
void
commit()
flushpendingentries()
;reset()
;}public
void
rollback()
private
void
reset()
// 重新整理合併快取鍵值對
private
void
flushpendingentries()
for(object entry : entriesmissedincache)
}}
mybatis的快取都比較雞肋,不推薦使用。
mybatis一級快取詳解
mybatis 二級快取全詳解
mybatis兩級快取原理剖析
對於mybatis的快取認識一直有乙個誤區,所以今天寫一篇文章幫自己訂正一下。mybatis的快取分一級快取與二級快取。下面分別對這兩種快取進行詳細解說。首先我們需要大致的了解一下mybatis的呼叫鏈,然後才能更好的理解mybatis的快取。主要的api羅列如下 public inte ce sq...
兩級節點的樹
兩級節點的樹 效果圖 說明 這是只顯示兩級節點的樹,並且窗體載入的時候樹就成展開形式,並不需要非同步載入!jsp 初始投訴分類 function p initpreclass single true function listcomplain classid d5 gridmanager.loadd...
3 1 9 兩級頁表
單級頁表的幾個問題 1 因為頁表的特性,需要連續存放,當程序需要很多個頁面,就需要很大的頁表,就需要很大一塊連續的區域去存放頁表 2 根據區域性性原理,沒必要讓頁表常駐記憶體 因為頁表太大,需要連續一大片記憶體的解決方法是 重新建立起對一級頁表的頁表,頁目錄表 將邏輯位址程序拆分成一級頁號和二級頁號...