MyBatis緩存

MyBatis提供了數據緩存支持,依據數據緩存的有效範圍默認定義了一級緩存和二級緩存

一級緩存

該級緩存默認開啓,不能關閉;

該級緩存爲SqlSession級別的緩存,也稱爲本地緩存;

以下面爲例。在同一 Session 裏執行同一個查詢兩次,控制檯日誌只有一個查詢

 以下4種情況將會導致該級緩存失效

a、在不同SqlSession中查詢數據;

 

 b、相同SqlSession中查詢數據,但查詢條件不同

c、相同SqlSession中查詢數據,但兩次查詢之間執行了增刪改操作 

 

 d、相同SqlSession中查詢數據,但第二次查詢前,程序調用SqlSession對象clearCache()方法手動清除了一級緩存

 

 二級緩存

該級緩存默認不開啓,但如果使用二級緩存需要在每個XML映射文件中添加<cache></cache>以配置該級緩存。二級緩存可以通過在全局配置文件配置setting標籤來關閉該級緩存。

    cache標籤屬性:

    eviction:緩存回收策略:

    LRU – 最近最少使用的:移除最長時間不被使用的對象,默認值

    FIFO – 先進先出:按對象進入緩存的順序來移除它們。

    SOFT – 軟引用:移除基於垃圾回收器狀態和軟引用規則的對象。

    WEAK – 弱引用:更積極地移除基於垃圾收集器狀態和弱引用規則的對象。

    flushInterval:刷新間隔,單位毫秒,默認情況是不設置,也就是沒有刷新間隔,緩存僅僅調用語句時刷新

    size:引用數目,正整數,代表緩存最多可以存儲多少個對象,太大容易導致內存溢出

    readOnly:只讀,默認爲false。true:只讀緩存;會給所有調用者返回緩存對象的相同實例,速度快;false:讀寫緩存;會返回緩存對象的拷貝(通過序列化),速度慢但安全。

該級緩存爲namespace級別的緩存

工作機制:通過SqlSession查詢數據,這些數據將會放到當前會話的一級緩存中;如果當前會話關閉,則一級緩存中的數據會被保存到二級緩存中,此後新的SqlSession將從二級緩存中查找數據;

例如我們在下面的 user_info.xml中加入 <cache>標籤。

這個時候我們還需要對 vo 類進行序列化一下。

 

 

 可以看到二級緩存實現了跨Session 操作。在不同的Session中執行同一個操作,可以直接從二級緩存得到數值。

 

 而在中間加入增刪改操作會導致清除二級緩存,然後再次進行查詢,如下。

 

 

 而當我們在xml中配置<cache>之後,可以對下面的數據庫操作標籤添加屬性。select標籤的useCache屬性用於設置是否使用二級緩存;insert、update、delete或select標籤均有flushCache屬性,其中增刪改默認true,即sql執行以後,會同時清空一級和二級緩存,查詢默認false。

我們將 delete 的flushCache 改爲false 即執行之後不清緩存。

 

 

 

 可以看出如果設置成fasle 不清除緩存,最後查詢的結果會出錯。在刪除了一個元素之後,查詢的個數依然沒有變化。

所以一般我們不會改變默認值true。

但這也是Mybatis 緩存的一個缺點,他在清除二級緩存時,清除的是所有的二級緩存,然後再獲取數據,如果緩存中的數據非常多的情況下,會對資源造成極大的浪費。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章