標籤:

Mybatis7:查詢緩存

1.1 什麼是查詢緩存

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

mybaits提供一級緩存,和二級緩存。

一級緩存是SqlSession級別的緩存。在操作資料庫時需要構造 sqlSession對象,在對象中有一個數據結構(HashMap)用於存儲緩存數據。不同的sqlSession之間的緩存數據區域(HashMap)是互相不影響的。

存入HashMap,每次需要用到時查詢該SqlSession是否已經存在。

二級緩存是mapper級別的緩存,多個SqlSession去操作同一個Mapper的sql語句,多個SqlSession可以共用二級緩存,二級緩存是跨SqlSession的。

為什麼要用緩存?

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

1. 2一級緩存

第一次發起查詢用戶id為1的用戶信息,先去找緩存中是否有id為1的用戶信息,如果沒有,從資料庫查詢用戶信息。

得到用戶信息,將用戶信息存儲到一級緩存中。

如果sqlSession去執行commit操作(執行插入、更新、刪除),清空SqlSession中的一級緩存,這樣做的目的為了讓緩存中存儲的是最新的信息,避免臟讀。

第二次發起查詢用戶id為1的用戶信息,先去找緩存中是否有id為1的用戶信息,緩存中有,直接從緩存中獲取用戶信息。

mybatis默認支持一級緩存,不需要在配置文件去配置。

一級緩存應用

正式開發,是將mybatis和spring進行整合開發,事務控制在service中。

一個service方法中包括 很多mapper方法調用。

service{

//開始執行時,開啟事務,創建SqlSession對象

//第一次調用mapper的方法findUserById(1)

//第二次調用mapper的方法findUserById(1),從一級緩存中取數據

//方法結束,sqlSession關閉

}

如果是執行兩次service調用查詢相同 的用戶信息,不走一級緩存,因為session方法結束,sqlSession就關閉,一級緩存就清空。

---------------------------------------------------------------------------------------------------------------------------

1.1 二級緩存

1.1.1 原理

首先開啟mybatis的二級緩存。

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

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

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

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

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

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

1.2 二級應用場景

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

實現方法如下:通過設置刷新間隔時間,由mybatis每隔一段時間自動清空緩存,根據數據變化頻率設置緩存刷新間隔flushInterval,比如設置為30分鐘、60分鐘、24小時等,根據需求而定。

1.3 二級緩存局限性

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

二級緩存的具體使用。待更新。


推薦閱讀:

spring mybatis每次訪問資料庫都要創建資料庫鏈接?
如何在mybatis中調試查看生成的sql語句?
Mybatis9:Mybatis與Hibernate區別

TAG:MyBatis |