關於MyBatis中一級快取的一些思考 二

2021-10-08 19:51:53 字數 1701 閱讀 7645

今天在繼續學習關於mybatis快取知識的時候,了解到一些關於快取有關的設定對一級快取和二級快取作用域的問題。大致上可以包含一些幾條:

* 1.cacheenabled=true/false(開啟/關閉快取,在全域性配置檔案的setting標籤中設定):關閉了二級快取,一級快取一直可用;

* 2.usecache=「true」(預設為true):每個select標籤都有這個屬性,當值設定為false時表示不使用快取(一級快取依然使用,二級快取被關閉(但是只針對這一條語句來說));

* 3.每個增刪改標籤都有乙個屬性:flushcache=「true」(預設為true):

(一級二級快取都會清除)在select標籤中也有flushcache屬性,但是其預設為false,也就是在進行查詢時預設不清空快取;如果改為true,每次查詢之前都會清空快取(快取沒被使用),意思是增刪改執行完以後就會清除快取:測試結果flushcache=「true」:一級快取被清空,二級快取也會被清空;

* 4.sqlsession.clearcache():只是清除當前sqlsession的一級快取;

* 5.localcachescope:(本地快取作用域,針對一級快取)mybatis使用本地快取來防止迴圈引用並加速重複的巢狀查詢。預設情況下(預設值是session),在會話期間執行的所有查詢都被快取。如果localcachescope=statement本地會話僅用於語句執行,那麼在對同一sqlsession的兩個不同呼叫之間將不會共享資料(禁用快取,一般不用)。

對於第4條在測試的時候,首先是利用一次會話讀取資料,然後將該會話關閉,此時一級快取中的資料會存到對應的二級快取中去。之後利用第二個會話首先執行一次clearcache()方法,之後再讀取第乙個會話之前查詢的資料,如果是從快取中查詢的資料,則證明二級快取沒有被清空。**如下:

@test

public

void

testsecondlevelcache()

throws exception

finally

}

執行結果如下:

這裡可以看到對於同一條查詢,在進行了clearcache()方法呼叫之後,並沒有對二級快取產生什麼影響,在第二次呼叫時是直接從快取中取的資料。

@test

public

void

testsecondlevelcache()

throws exception

finally

}

mybatis的快取機制中二級快取只有當一級快取關閉之後,才會將一級快取中的內容儲存在對映檔案所對應的二級快取中去。這裡的結果顯然不符合這一結論,這裡可能是mybatis的內部設定,包括clearcache()方法執行過程以及mybatis處理清除快取的過程有一定得關係。

這裡我只對mybatis自帶的cache介面的乙個實現類perpetualcache進行了研究,發現其clear方法僅僅只是簡簡單單的對cache儲存資料的hashmap進行了一次clear()而已,並沒有其他的操作,**如下:

可能要深究這一問題的原因還要等挖掘一下mybatis清除快取部分的原始碼。這一問題有待之後解決。

mybatis一級快取

autowired private sqlsessionfactory sqlsessionfactory autowired test transactional public void test selectall.size log.info 第2次查詢 selectall2.size 同乙個s...

MyBatis 一級快取

本地快取作用域預設為該sqlsession。當session flush或 close後,該session中的所有cache將清空。同一次會話期間,只要查詢過的資料都會儲存在當前sqlsession的乙個map中 key hashcode 查詢sql的id 編寫的sql語句 引數 1.不同的sqls...

mybatis一級快取

mybatis一級快取在沒有使用事務後,本地看不到效果,查詢時還是查詢了兩次資料庫。如下圖所示 開啟事務,在同乙個方法 同乙個回話,一級快取才有效果 transactional public refund getrefundtest long brefundid 加上事務後效果如下 一級快取什麼時候...