1. 程式人生 > 其它 >mybatis之快取

mybatis之快取

技術標籤:mybatisjava

一、簡介

什麼是快取?

  • 存在記憶體中的臨時資料

為什麼使用快取?

  • 減少互動次數,減少系統開銷,提高系統效率

什麼樣的資料能使用快取?

  • 經常查詢但不經常修改的資料
    我們再次查詢資料的時候,直接走快取,就可以不要走資料庫

MyBatis 內建了一個強大的事務性查詢快取機制,它可以非常方便地配置和定製。

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

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

二、一級快取

一級快取也叫本地快取,是預設開著的

測試步驟:

  1. 開啟日誌
  2. 測試在一次session中查詢兩次相同的記錄
  3. 檢視日誌輸出
 @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>