mybatis系統中預設定義了兩級快取。
一級快取和二級快取
1、預設情況下只有一級快取(sqlsession級別的快取,也稱為本地快取)開啟
2、二級快取需要手動開啟和配置,它是基於namespace級別的快取
3、為了提高擴充套件性。mybatis定義了快取藉口cache,我們可以通過實現cache藉口來自定義二級快取
一級快取
一級快取:(本地快取):sqlsession級別的快取,一級快取是一直開啟的;sqlsession級別的乙個map
* 與資料庫同一次會話期間查詢到的資料會放在本地快取中
* 以後如果需要獲取相同的資料,直接從快取中獲取,沒必要再去從查詢資料庫
** 一級快取失效情況(沒有使用到當前一級快取的情況,結果就是還需要向資料庫發出查詢)
* 1、sqlsession不同
* 2、sqlsession相同,但是查詢條件不同(當前一級快取中還沒有這個資料)
* 3、sqlsession相同,但是兩次查詢之間實現了增刪改操作(這次增刪改可能對當前操作有影響)
* 4、sqlsession相同,但是認為手動清除了一級快取
二級快取
name最開始測試的時候:="cacheenabled"
value
="true"
/>
>
eviction
="fifo"
flushinterval
="6000"
readonly
="false"
size
="1024"
>
id="emp"
>
id,last_name,email,gender
id="emp"
type
="bean.employee"
>
column
="id"
property
="id"
/>
column
="last_name"
property
="lastname"
/>
column
="email"
property
="email"
/>
column
="gender"
property
="gender"
/>
id="getemps"
resultmap
="emp"
>
select
refid
="emp"
>
from t_employee
test
="id!=null"
>
id=#
public sqlsession getsqlsession() throws ioexception
@test直接呼叫了getsqlsession方法,建立了兩次sqlsessionfactory物件,結果:public void
testsecondlevelcache() throws ioexception finally
}
開啟二級快取失敗了
查閱資料改為:
@test兩次獲得sqlsession物件只建立了一次sqlsessionfactory,開啟二級快取okpublic void
testsecondlevelcache() throws ioexception finally
}
和快取有關的設定和屬性
1)cacheenabled=true開啟快取;false關閉快取(關閉的是二級快取,一級快取可用不受影響)
2)每個select標籤都會有usecache="true"屬性,
false:不使用快取(一級快取不受影響,二級快取不可用)
3)每個增刪改的 flushcache="true"預設,(一級二級都會清除)
* ——增刪改執行完成之後就會清除快取
* 測試:flushcache="true",就會清空一級快取,二級快取也會被清空
* 查詢標籤預設:flushcache="false",如果改為true則每次查詢之後都會清理快取,所以快取是沒有被使用的
4)sqlsession.clearcache( );只清除當前session的一級快取,對二級快取沒影響
5)localcachescope:本地快取作用域(一級快取)
session:當前回話的所有資料儲存在會話快取中
statement:可以禁用一級快取
快取原理圖:
mybatis快取機制
mybatis和hibernate一樣,也提供了一二級快取。若存在一二級快取,則資料不會去資料庫互動,而是去記憶體中獲取。一級快取是sqlsession級別的快取。在運算元據庫時需要構造sqlsession物件,在物件中有乙個資料結構 一般來說是hashmap 來儲存快取資料。不同的sqlsessi...
MyBatis 快取機制
mybatis 提供了查詢快取來獲取資料,以提高查詢的效能。mybatis 的快取分為一級快取和二級快取。1 一級快取一級快取是 sqlsession 級別的快取,是基於 hashmap 的本地快取。不同的 sqlsession 之間的快取資料區域互不影響。當同乙個 sqlsession 執行兩次相...
Mybatis 快取機制
查詢快取主要是為了提高查詢訪問速度,即當使用者執行一次查詢後,會將該資料結果放到快取中,當下次再執行此查詢時就不會訪問資料庫了而是直接從快取中獲取該資料。如果在快取中找到了資料那叫做命中。同一sqlsession 多次查詢同一sql時會使用快取 test public void testlocalc...