mybatis之快取
一、簡介
什麼是快取?
- 存在記憶體中的臨時資料
為什麼使用快取?
- 減少互動次數,減少系統開銷,提高系統效率
什麼樣的資料能使用快取?
- 經常查詢但不經常修改的資料
我們再次查詢資料的時候,直接走快取,就可以不要走資料庫
MyBatis 內建了一個強大的事務性查詢快取機制,它可以非常方便地配置和定製。
①、一級快取是SqlSession級別的快取。在操作資料庫時需要構造sqlSession物件,在物件中有一個數據結構(HashMap)用於儲存快取資料。不同的sqlSession之間的快取資料區域(HashMap)是互相不影響的。
②、二級快取是mapper級別的快取,多個SqlSession去操作同一個Mapper的sql語句,多個SqlSession可以共用二級快取,二級快取是跨SqlSession的。
二、一級快取
一級快取也叫本地快取,是預設開著的
測試步驟:
- 開啟日誌
- 測試在一次session中查詢兩次相同的記錄
- 檢視日誌輸出
@Test
public void getUserByIdTest(){
SqlSession sqlSession = MybatisUtil.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
User user = mapper.getUserById(1);
System.out. println(user);
System.out.println("-===========================-");
User user2 =mapper.getUserById(1);
System.out.println(user2);
System.out.println(user==user2);
}
執行結果如下:
預設情況下,只啟用了本地的會話快取,它僅僅對一個會話中的資料進行快取。
基本上就是這樣。這個簡單語句的效果如下: 對映語句檔案中的所有 select 語句的結果將會被快取。 對映語句檔案中的**所有 insert、update 和 delete 語句**會重新整理快取。 快取會使用最近最少使用演算法(LRU, Least Recently Used)演算法來清除不需要的快取。 快取**不會定時進行重新整理**(也就是說,沒有重新整理間隔)。 快取會儲存列表或物件(無論查詢方法返回哪種)的 1024 個引用。 快取會被視為讀/寫快取,這意味著獲取到的物件並不是共享的,可以安全地被呼叫者修改,而不干擾其他呼叫者或執行緒所做的潛在修改。 快取失效的情況: 1.增刪改操作會改變原來的資料,所以會重新整理快取 ![增刪改操作重新整理快取](https://img-blog.csdnimg.cn/20201209154011814.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQ4NjA4NTk4,size_16,color_FFFFFF,t_70#pic_center) 2.查詢不同的Mapper.xml 3.查詢不同的東西 4.手動清理快取 ```java sqlSession.clearCache();
一級快取預設是開啟的,只在一次sqlsession中有效,也就是拿到連線到關閉連線這個區間有效
三、二級快取
-
二級快取也叫全域性快取,一級快取的作用域太低,所以就有了二級快取
-
基於namespace的快取,一個名稱空間對應一個二級快取
-
二級快取開啟後,一級快取關閉時,二級快取開始生效,一級快取的資料也會儲存到二級快取
要啟用全域性的二級快取,只需要在你的 SQL 對映檔案中新增一行:
<cache/>
快取只作用於 cache 標籤所在的對映檔案中的語句。如果你混合使用 Java API 和 XML 對映檔案,在共用介面中的語句將不會被預設快取。你需要使用 @CacheNamespaceRef 註解指定快取作用域。
這些屬性可以通過 cache 元素的屬性來修改。比如:
<cache
eviction="FIFO"
flushInterval="60000"
size="512"
readOnly="true"/>
這個更高階的配置建立了一個 FIFO 快取,每隔 60 秒重新整理,最多可以儲存結果物件或列表的 512 個引用,而且返回的物件被認為是隻讀的,因此對它們進行修改可能會在不同執行緒中的呼叫者產生衝突。
可用的清除策略有:
LRU – 最近最少使用:移除最長時間不被使用的物件。
FIFO – 先進先出:按物件進入快取的順序來移除它們。
SOFT – 軟引用:基於垃圾回收器狀態和軟引用規則移除物件。
WEAK – 弱引用:更積極地基於垃圾收集器狀態和弱引用規則移除物件。
預設的清除策略是 LRU。
開啟步驟:
1.開啟全域性快取
<settings>
<setting name="cacheEnables" value="true"/>
</settings>
2.在Mapper.xml 檔案中開啟快取
<!-- 開啟二級快取 -->
<cache></cache>
三、自定義快取ehcache
- Ehcache是一種廣泛使用的開源Java分散式快取。主要面向通用快取,Java EE和輕量級容器。。它具有記憶體和磁碟儲存,快取載入器,快取擴充套件,快取異常處理程式,一個gzip快取servlet過濾器,支援REST和SOAP api等特點。
使用:
1.導包
<dependency>
<groupId>org.mybatis.caches</groupId>
<artifactId>mybatis-ehcache</artifactId>
<version>1.1.0</version>
</dependency>
2.Mapper對映檔案配置
cache type="org.mybatis.caches.ehcache"></cache>