1. 程式人生 > 其它 >計算機網路七層體系結構圖

計算機網路七層體系結構圖

簡介:

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

&lt;select id="getStudentById"parameterType="java.lang.Integer"resultType="Student"useCache="false"&gt;

在實際開發中,針對每次查詢都需要最新的資料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為單位劃分,當一個商品資訊變化會將所有商品資訊的快取資料全部清空。解決此類問題需要在業務層根據需求對資料有針對性快取。