1. 程式人生 > >Mybatis的一級快取和二級快取的理解和區別

Mybatis的一級快取和二級快取的理解和區別

一級快取基於sqlSession預設開啟,在操作資料庫時需要構造SqlSession物件,在物件中有一個HashMap用於儲存快取資料。不同的SqlSession之間的快取資料區域是互相不影響的。


一級快取的作用域是SqlSession範圍的,當在同一個sqlSession中執行兩次相同的sql語句時,第一次執行完畢會將資料庫中查詢的資料寫到快取(記憶體),


第二次查詢時會從快取中獲取資料,不再去底層資料庫查詢,從而提高查詢效率。


需要注意的是,如果SqlSession執行了DML操作(增刪改),並且提交到資料庫,MyBatis則會清空SqlSession中的一級快取,這樣做的目的是為了保證快取中儲存的是最新的資訊,避免出現髒讀現象。


當一個SqlSession結束後該SqlSession中的一級快取也就不存在了。


關閉一級快取後,再次訪問,需要再次獲取一級快取,然後才能查詢資料,否則會丟擲異常。
二級快取是mapper級別的快取。使用二級快取時,多個SqlSession使用同一個Mapper的sql語句去操作資料庫,得到的資料會存在二級快取區域,它同樣是使用HashMap進行資料儲存。相比一級快取SqlSession,二級快取的範圍更大,多個Sqlsession可以共用二級快取,二級快取是跨SqlSession的。


二級快取
的作用域是mapper的同一個namespace。不同的sqlSession兩次執行相同的namespace下的sql語句,且向sql中傳遞的引數也相同,即最終執行相同的sql語句,則第一次執行完畢會將資料庫中查詢的資料寫到快取,第二次查詢會從快取中獲取資料,不再去底層資料庫查詢,從而提高效率。
在MyBatis配置檔案(mybatis-config.xml)中開啟二級快取(詳細過程自己百度搜索開啟)
//value屬性預設為false
在**Mapper.xml中開啟當前mapper的namespace下的二級快取


代表建立了一個LRU快取,並每隔60秒重新整理,最大儲存512個物件,而且返回的物件被認為是隻讀的。
evicition收回策略,預設是LRU(1)LRU最近最少使用策略,一處做長時間不被使用的物件。
(2)FIFO先進先出策略,按物件進入快取的順序來移除它們。
(3)SOFT軟引用策略,移除基於垃圾回收器狀態和軟引用規則的物件。
(4)WEAK弱引用策略,更積極地移除基於垃圾收集器狀態和弱引用規則的物件