1. 程式人生 > >mybatis中的查詢快取例項

mybatis中的查詢快取例項

mybatis中的查詢快取

一: 查詢快取   Mybatis提供查詢快取,用於減輕資料壓力,提高資料庫壓力。   Mybatis提供一級快取和二級快取。

在操作資料庫時需要構造SqlSession物件,在物件中有一個數據結構(HashMap)用於快取資料。

不同的SqlSession之間的快取資料區域是互相不影響的。

Mybatis一級快取的作用域是同一個SqlSession,在同一個sqlSession中兩次執行相同的sql語句,第一次執行完畢會將資料庫中查詢的資料寫到快取(記憶體),第二次會從快取中獲取資料將不再從資料庫查詢,從而提高查詢效率。當一個sqlSession結束後該sqlSession中的一級快取也就不存在了。Mybatis預設開啟一級快取。

Mybatis二級快取是多個SqlSession共享的,其作用域是mapper的同一個namespace,不同的sqlSession兩次執行相同namespace下的sql語句且向sql中傳遞引數也相同即最終執行相同的sql語句,第一次執行完畢會將資料庫中查詢的資料寫到快取(記憶體),第二次會從快取中獲取資料將不再從資料庫查詢,從而提高查詢效率。Mybatis預設沒有開啟二級快取需要在setting全域性引數中配置開啟二級快取。

1、一級快取

第一次發起查詢,先去找快取中是否有id為1的使用者資訊,如果沒有,從資料庫中查詢使用者資訊。   得到使用者資訊,將使用者資訊儲存到一級快取中。   第二次發起查詢使用者id為1的使用者資訊,先去快取中是否有id為1的使用者資訊,快取中有,直接從快取中獲取使用者資訊。   如果SqlSession去執行commit操作(執行插入、更新、刪除),清空SqlSession中的一級快取。目的是為了讓快取中儲存的是最新的資訊,避免髒讀。   Mybatis預設支援一級快取,不需要在配置檔案中配置。   Mybatis內部儲存快取使用一個HashMap,key為hashCode+sqlId+Sql語句。value為從查詢出來對映生成的java物件。

應用場景:   2、二級快取

SqlSession1去查詢使用者id為1的使用者資訊,查詢到使用者資訊會將查詢資料儲存到二級快取中。   SqlSession2去查詢使用者id為1的使用者資訊,去快取中找是否存在資料,如果存在直接從快取中取出資料。   二級快取區域是根據mapper的namespace劃分的,相同namespace的mapper查詢資料放在同一個區域,如果使用mapper代理方法每個mapper的namespace都不同,此時可以理解為二級快取區域是根據mapper劃分。 每次查詢會先從快取區域找,如果找不到從資料庫查詢,查詢到資料將資料寫入快取。   Mybatis內部儲存快取使用一個HashMap,key為hashCode+sqlId+Sql語句。value為從查詢出來對映生成的java物件   sqlSession執行insert、update、delete等操作commit提交後會清空快取區域。   開啟二級快取:

1.在核心配置檔案mybatis-config.xml中加入

<setting name="cacheEnabled" value="true"/>

|||描述|允許值|預設值| |cacheEnabled|對在此配置檔案下的所有cache 進行全域性性開/關設定。|true false|true| 2. 要在你的Mapper對映檔案中新增一行: ,表示此mapper開啟二級快取。   3.二級快取需要查詢結果對映的pojo物件實現java.io.Serializable介面實現序列化和反序列化操作,注意如果存在父類、成員pojo都需要實現序列化介面。

為了將快取資料取出執行反序列化,因為二級快取儲存介質多種多樣,不一定在記憶體。

禁用二級快取:

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

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

重新整理快取(就是清空快取):

設定statement配置中的flushCache=“true” 屬性,預設情況下為true即重新整理快取,如果改成false則不會重新整理。使用快取時如果手動修改資料庫表中的查詢資料會出現髒讀。

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

應用場景:

對於訪問多的查詢請求且使用者對查詢結果實時性要求不高,此時可採用mybatis二級快取技術降低資料庫訪問量,提高訪問速度,業務場景比如:耗時較高的統計分析sql、電話賬單查詢sql等。

  實現方法如下:通過設定重新整理間隔時間,由mybatis每隔一段時間自動清空快取,根據資料變化頻率設定快取重新整理間隔flushInterval,比如設定為30分鐘、60分鐘、24小時等,根據需求而定。

侷限性:

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

二:案例

原始碼介紹:

1.Student.java