MyBatis緩存配置

一、緩存:
所謂的緩存從廣義上來講:提升數據的查詢性能。通過整個的計算機的結構來講,CPU所需要的數據通過內存取得,而內存的數據可以通過磁盤加載完成。但是在整個的項目的開發環節過程之中會出現一種可怕的問題:就是說計算機可能很忙碌,一個進程需要進行磁盤文件的讀取,需要1S的時間,但是如果說現在有20W個進程同時需要進行數據的讀取過程,那麼這個過程就有可能造成計算機的假死狀態。所以現在的開發基本上需要解決最大的問題就在於:內存和磁盤之間的數據讀取效率問題。
所以這個時候發現程序效率最大的問題都來自於磁盤。
緩存
在整個的緩存操作過程之中需要考慮如下幾種問題:
· 什麼樣的數據需要被放在緩存裏?
· 數據需要在什麼時候通過緩存清空;
· 數據如果都保存在一個緩存裏面,可能不方便。
緩存一般分爲兩種:一級緩存(單個用戶、SqlSession)、二級緩存(所有用戶、SqlSessionFactory)。
當你使用了緩存的話,就意味着你喪失了自動數據同步的功能支持。也就是說在內存中的數據與數據表中的數據可能不一致。
二、一級緩存
一級緩存指的是SqlSession 級的緩存處理,並且不管用戶如何處理,一級緩存永遠都會存在。
由於查詢的是同一條數據的記錄,並且是同一個SqlSession 接口對象發出的,所以最終只向數據庫裏面發送了一次數據查詢的請求,而第二次的查詢並沒有發出請求,因爲它發現緩存中有同樣的數據存在。
實際當修改了第一次查詢結果中的數據之後,隨後第二次查詢的結果裏面的內容也會發生相應的改變,但是此時數據庫之中並沒有任何的變化。
那麼如果說同樣的操作,在第二次查詢前進行了一個數據更新操作呢?
此時的緩存並沒有起作用,第二次的查詢會直接進行數據庫的查詢操作處理。這是因爲在進行提交處理的時候,會自動進行緩存的清空,因爲它認爲這個數據已經沒有必要進行緩存了。
如果有需要也可以利用SqlSession 接口中提供的方法進行手工的緩存清空:
· 手工清空緩存:public void clearCache()
三、二級緩存
兩個不同用戶查詢相同數據,那麼這些數據默認情況下是無法緩存的,並且每一個SqlSession 都要發出查詢指令。
1、 如果要想開啓二級緩存,則需要進行如下修改:

<!-- 進行Mybatis的相應的環境的屬性定義 -->
<settings> <!-- 在本項目之中開啓二級緩存 -->
    <setting name="cacheEnabled" value="true"/>
</settings>

· 在需要使用到News.xml 的緩存文件上進行相應的配置,表示該文件允許使用緩存:

<cache/>

2、 如果要想真正啓用緩存,還需要注意兩點:
· 第一個session 必須關閉之後纔會將內容寫入到二級緩存之中,如果不關閉,緩存無法寫入:
如果要想進行緩存的實現,那麼VO 類一定要實現java.io.Serializable 接口:
3、News.xml 文件裏面簡單的編寫了一個“cache/”配置,這個配置實際上只是啓用了默認的緩存模式:
但是對於以上的參數的詳細解釋如下:
· “eviction=”FIFO””:表示該緩存操作所使用的算法,有如下幾種算法模式:
|- LRU(默認的):最近最少使用算法,將最近不使用的對象進行清空;
|- FIFO:先進先出算法,默認會自動清除最早緩存的數據對象;
|- SOFT:軟引用,當內存不足時,執行GC 會立刻清除;
|- WEAK:弱應用,只要發生了GC,該緩存的對象就會被清空。
· “flushInterval=”10000””:緩存的刷新時間,單位爲毫秒;
· “readOnly=”true””:緩存永遠做只讀配置,千萬不要做讀、寫配置;
· “size=”512””:佔用的內存大小,默認是1024K。

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