二級緩存(16)

前記:這是很早之前自學學習myBatis時的筆記,內容比較基礎,適合新手,內容基本是來自網絡,如有雷同,敬請諒解!

    二級緩存

      原理


首先開啓mybatis的二級緩存。

sqlSession1去查詢用戶id爲1的用戶信息,查詢到用戶信息會將查詢數據存儲到二級緩存中。

如果SqlSession3去執行相同 mapper下sql,執行commit提交,清空該 mapper下的二級緩存區域的數據。

sqlSession2去查詢用戶id爲1的用戶信息,去緩存中找是否存在數據,如果存在直接從緩存中取出數據。

二級緩存與一級緩存區別,二級緩存的範圍更大,多個sqlSession可以共享一個UserMapper的二級緩存區域。

UserMapper有一個二級緩存區域(按namespace分),其它mapper也有自己的二級緩存區域(按namespace分)。

每一個namespace的mapper都有一個二緩存區域,兩個mapper的namespace如果相同,這兩個mapper執行sql查詢到數據將存在相同的二級緩存區域中。

   開啓二級緩存

                     mybaits的二級緩存是mapper範圍級別,除了在SqlMapConfig.xml設置二級緩存的總開關,還要在具體的mapper.xml中開啓二級緩存

在覈心配置文件SqlMapConfig.xml中加入

          <settingname="cacheEnabled"value="true"/>

 

描述

允許值

默認值

cacheEnabled

對在此配置文件下的所有cache 進行全局性開/關設置。

true false

true

 

在UserMapper.xml中開啓二緩存,UserMapper.xml下的sql執行完成會存儲到它的緩存區域(HashMap)。

 

     實現序列化

         二級緩存需要查詢結果映射的pojo對象實現java.io.Serializable接口實現序列化和反序列化操作。

        注意如果存在父類、成員pojo都需要實現序列化接口。

         publicclass Orders implements Serializable

         publicclass User implements Serializable

         ....

     禁用二級緩存

                   在statement中設置useCache=false可以禁用當前select語句的二級緩存,即每次查詢都會發出sql去查詢,默認情況是true,即該sql使用二級緩存。

                     <select id="findOrderListResultMap"resultMap="ordersUserMap"useCache="false">

       總結:針對每次查詢都需要最新的數據sql,要設置成useCache=false,禁用二級緩存。

      刷新緩存(就是清空緩存)

在mapper的同一個namespace中,如果有其它insert、update、delete操作數據後需要刷新緩存,如果不執行刷新緩存會出現髒讀。

 設置statement配置中的flushCache="true" 屬性,默認情況下爲true即刷新緩存,如果改成false則不會刷新。使用緩存時如果手動修改數據庫表中的查詢數據會出現髒讀。

如下:

<insert id="insertUser"parameterType="cn.itcast.mybatis.po.User"flushCache="true">

總結:一般下執行完commit操作都需要刷新緩存,flushCache=true表示刷新緩存,這樣可以避免數據庫髒讀。

     myBatis cache參數

flushInterval(刷新間隔)可以被設置爲任意的正整數,而且它們代表一個合理的毫秒形式的時間段。默認情況是不設置,也就是沒有刷新間隔,緩存僅僅調用語句時刷新。

size(引用數目)可以被設置爲任意正整數,要記住你緩存的對象數目和你運行環境的可用內存資源數目。默認值是1024。

readOnly(只讀)屬性可以被設置爲true或false。只讀的緩存會給所有調用者返回緩存對象的相同實例。因此這些對象不能被修改。這提供了很重要的性能優勢。可讀寫的緩存會返回緩存對象的拷貝(通過序列化)。這會慢一些,但是安全,因此默認是false。

如下例子:

<cache  eviction="FIFO"  flushInterval="60000" size="512"  readOnly="true"/>

這個更高級的配置創建了一個 FIFO 緩存,並每隔 60 秒刷新,存數結果對象或列表的 512 個引用,而且返回的對象被認爲是隻讀的,因此在不同線程中的調用者之間修改它們會導致衝突。可用的收回策略有, 默認的是 LRU:

1.      LRU – 最近最少使用的:移除最長時間不被使用的對象。

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

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

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


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