mybatis緩存機制


簡介:

mybatis提供查詢緩存,用於減輕數據庫壓力,提高數據庫性能

mybatis提供一級緩存和二級緩存

一級緩存:sqlsession級別的緩存

                  在操作數據庫時,需要構造sqlsession對象,在對象中有一個數據結構(HashMap)用於存儲緩存數據

                  不同的sqlsession之間的緩存區域是互相不影響的。

二級緩存:mapper級別的緩存

     多個sqlsession去操作同一個mapper的sql語句,多個sqlsession可以共用二級緩存,所得到的數據會存在二級緩存區域,

     二級緩存是跨sqlsession的

二級緩存相比一級緩存的范圍更大(按namespace來划分),多個sqlsession可以共享一個二級緩存

為什么要用緩存?

如果緩存中有數據,就不用從數據庫獲取,大大提高系統性能。

一級緩存工作原理:

圖解:

操作過程:

第一次發起查詢sql查詢用戶id為1的用戶,先去找緩存中是否有id為1的用戶,如果沒有,再去數據庫查詢用戶信息。得到用戶信息,將用戶信息存儲到一級緩存中。

如果sqlsession執行了commit操作(插入,更新,刪除),會清空sqlsession中的一級緩存,避免臟讀

第二次發起查詢id為1的用戶,緩存中如果找到了,直接從緩存中獲取用戶信息

mybatis默認支持一級緩存。

二級緩存實現原理

圖解:

首先要手動開啟mybatis二級緩存。

在config.xml設置二級緩存開關 , 還要在具體的mapper.xml開啟二級緩存

1.<settings>
<!--開啟二級緩存-->
<setting name="cacheEnabled" value="true"/>
</settings>

2.需要將映射的javapojo類實現序列化

          class Student implements Serializable{}

3.<!--開啟本Mapper的namespace下的二級緩存-->
<cache eviction="LRU" flushInterval="10000"/>

 cache屬性的簡介:

 eviction:代表的是緩存回收策略,目前MyBatis提供以下策略。

(1) LRU(Least Recently Used),最近最少使用的,最長時間不用的對象

(2) FIFO(First In First Out),先進先出,按對象進入緩存的順序來移除他們

(3) SOFT,軟引用,移除基於垃圾回收器狀態和軟引用規則的對象

(4) WEAK,弱引用,更積極的移除基於垃圾收集器狀態和弱引用規則的對象。這里采用的是LRU,
移除最長時間不用的對形象

flushInterval:刷新間隔時間,單位為毫秒,這里配置的是100秒刷新,如果你不配置它,那么當
SQL被執行的時候才會去刷新緩存。

size:引用數目,一個正整數,代表緩存最多可以存儲多少個對象,不宜設置過大。設置過大會導致內存溢出。
這里配置的是1024個對象 

readOnly:只讀,意味着緩存數據只能讀取而不能修改,這樣設置的好處是我們可以快速讀取緩存,缺點是我們沒有
辦法修改緩存,他的默認值是false,不允許我們修改

操作過程:

sqlsession1查詢用戶id為1的信息,查詢到之后,會將查詢數據存儲到二級緩存中。

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

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

禁用二級緩存:

在statement中可以設置useCache=false,禁用當前select語句的二級緩存,默認情況為true

<select id="getStudentById" parameterType="java.lang.Integer" resultType="Student" useCache="false">

在實際開發中,針對每次查詢都需要最新的數據sql,要設置為useCache="false" ,禁用二級緩存

flushCache標簽:刷新緩存(清空緩存)

<select id="getStudentById" parameterType="java.lang.Integer" resultType="Student" flushCache="true">

一般下執行完commit操作都需要刷新緩存,flushCache="true 表示刷新緩存,可以避免臟讀

二級緩存應用場景

對於訪問多的查詢請求並且用戶對查詢結果實時性要求不高的情況下,可采用mybatis二級緩存,降低數據庫訪問量,提高訪問速度,如電話賬單查詢

根據需求設置相應的flushInterval:刷新間隔時間,比如三十分鍾,24小時等。。。

二級緩存局限性:

 mybatis二級緩存對細粒度的數據級別的緩存實現不好,比如如下需求:對商品信息進行緩存,由於商品信息查詢訪問量大,但是要求用戶每次都能查詢最新的商品信息,此時如果使用mybatis的二級緩存就無法實現當一個商品變化時只刷新該商品的緩存信息而不刷新其它商品的信息,因為mybaits的二級緩存區域以mapper為單位划分,當一個商品信息變化會將所有商品信息的緩存數據全部清空。解決此類問題需要在業務層根據需求對數據有針對性緩存。。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM