MyBatis筆記(七)

linzeliang發表於2021-04-17

1. 簡介

  1. 什麼是快取?
    • 存在記憶體中的臨時資料
    • 將使用者經常查詢的資料存放在快取(記憶體)中,使用者取查詢就不用從磁碟上(關係型資料庫資料檔案)查詢,從快取中查詢,從而提高查詢效率,解決了高併發系統的效能問題
  2. 為什麼使用快取?
    • 減少和資料庫互動的次數
  3. 什麼樣的資料能使用快取?
    • 經常查詢並且不經常改變的資料

2. MyBatis快取

  • MyBatis包含一個非常強大的查詢快取特性,它可以非常方便地定製和配置快取,快取可以極大地提升查詢效率
  • MyBatis系統中預設定義了兩級快取:一級快取二級快取
    • 預設情況下,只有一級快取開啟(SqlSession級別地快取,也稱為本地快取)
    • 二級快取需要手動開啟和配置,它是基於namespace級別的快取
    • 為了提高擴充套件性,MyBatis定義了快取介面Cache,我們可以通過實現Cache介面來自定義二級快取

3. 一級快取

  • 一級快取是預設開啟的

  • 一級快取也叫本地快取:

    • 與資料庫同一次會話期間查到的資料會放在本地快取中
    • 以後如果要獲取相同的資料,直接從快取中拿,不用再去查詢資料庫了
  • 一級快取是SqlSession級別的快取,是一直開啟的,我們關閉不了它

  • 一級快取失效結果:查詢相同的資料仍需再次發起一次查詢請求

  • 一級快取失效的四種情況:

    1. sqlSession不同:每個sqlSession中的快取相互獨立

    2. sqlSession相同,查詢條件不同

    3. sqlSession相同,兩次查詢之間執行了增刪改操作

    4. sqlSession相同,手動清楚一級快取(使用謝列語句可以清除快取)

      session.clearCache();
      
  • 一級快取就是一個map

4. 二級快取

  • 二級快取也叫全域性快取,一級快取作用域太低了,所以產生了二級快取

  • 基於namespace級別的快取,一個名稱空間對應一個二級快取

  • 工作機制:

    • 一個會話查詢一個資料,這個資料就會被放在當前會話的一級快取中。如果當前會話關閉了,這個會話對應的一級快取就沒了。但是我們想要的是會話關閉了,一級快取中的資料被儲存到二級快取中,新的會話查詢資訊,就可以從二級快取中獲取內容,不同mapper查出的資料會藏在自己對應的快取(map)中
  • 開啟二級快取步驟:

    1. 開啟全域性快取mybatis-config.xml

      <setting name="cacheEnabled" value="true"/>
      
    2. 去每個mapper.xml中配置使用二級快取

      <cache/>
       
      官方示例=====>檢視官方文件
      <cache
        eviction="FIFO"
        flushInterval="60000"
        size="512"
        readOnly="true"/>
      <!-- 這個更高階的配置建立了一個 FIFO 快取,每隔 60 秒重新整理,最多可以儲存結果物件或列表的 512 個引用,而且返回的物件被認為是隻讀的,因此對它們進行修改可能會在不同執行緒中的呼叫者產生衝突。 -->
      
  • 總結:

    • 只要開啟了二級快取,我們在同一個mapper中的查詢,可以在二級快取中拿到資料
    • 查出的資料都會預設先放在一級快取中
    • 只有會話提交或者關閉以後,一級快取中的資料才會轉到二級快取中

5. 快取原理

  • 快取原理圖

    image-20210417000738269

6. EhCache

  • 第三方快取的實現 —— EhCache

  • EhCache是一種廣泛使用的Java分故事快取,用於通用快取

  • 在應用程式中使用EhCache

    • 引入依賴jar包

      <!-- https://mvnrepository.com/artifact/org.mybatis.caches/mybatis-ehcache -->
      <dependency>
          <groupId>org.mybatis.caches</groupId>
          <artifactId>mybatis-ehcache</artifactId>
          <version>1.1.0</version>
      </dependency>
      
    • 在mapper配置檔案中使用對應的快取即可

      <mapper namespace = “org.acme.FooMapper” > 
          <cache type = “org.mybatis.caches.ehcache.EhcacheCache” /> 
      </mapper>
      
    • 編寫ehcache.xml檔案,如果在載入時未找到/ehcache.xml資源或者出現問題,則將使用預設配置

      <?xml version="1.0" encoding="UTF-8"?>
      <ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
               xsi:noNamespaceSchemaLocation="http://ehcache.org/ehcache.xsd"
               updateCheck="false">
          <!--
             diskStore:為快取路徑,ehcache分為記憶體和磁碟兩級,此屬性定義磁碟的快取位置。引數解釋如下:
             user.home – 使用者主目錄
             user.dir  – 使用者當前工作目錄
             java.io.tmpdir – 預設臨時檔案路徑
           -->
          <diskStore path="./tmpdir/Tmp_EhCache"/>
      
          <defaultCache
                        eternal="false"
                        maxElementsInMemory="10000"
                        overflowToDisk="false"
                        diskPersistent="false"
                        timeToIdleSeconds="1800"
                        timeToLiveSeconds="259200"
                        memoryStoreEvictionPolicy="LRU"/>
      
          <cache
                 name="cloud_user"
                 eternal="false"
                 maxElementsInMemory="5000"
                 overflowToDisk="false"
                 diskPersistent="false"
                 timeToIdleSeconds="1800"
                 timeToLiveSeconds="1800"
                 memoryStoreEvictionPolicy="LRU"/>
          <!--
             defaultCache:預設快取策略,當ehcache找不到定義的快取時,則使用這個快取策略。只能定義一個。
           -->
          <!--
            name:快取名稱。
            maxElementsInMemory:快取最大數目
            maxElementsOnDisk:硬碟最大快取個數。
            eternal:物件是否永久有效,一但設定了,timeout將不起作用。
            overflowToDisk:是否儲存到磁碟,當系統當機時
            timeToIdleSeconds:設定物件在失效前的允許閒置時間(單位:秒)。僅當eternal=false物件不是永久有效時使用,可選屬性,預設值是0,也就是可閒置時間無窮大。
            timeToLiveSeconds:設定物件在失效前允許存活時間(單位:秒)。最大時間介於建立時間和失效時間之間。僅當eternal=false物件不是永久有效時使用,預設是0.,也就是物件存活時間無窮大。
            diskPersistent:是否快取虛擬機器重啟期資料 Whether the disk store persists between restarts of the Virtual Machine. The default value is false.
            diskSpoolBufferSizeMB:這個引數設定DiskStore(磁碟快取)的快取區大小。預設是30MB。每個Cache都應該有自己的一個緩衝區。
            diskExpiryThreadIntervalSeconds:磁碟失效執行緒執行時間間隔,預設是120秒。
            memoryStoreEvictionPolicy:當達到maxElementsInMemory限制時,Ehcache將會根據指定的策略去清理記憶體。預設策略是LRU(最近最少使用)。你可以設定為FIFO(先進先出)或是LFU(較少使用)。
            clearOnFlush:記憶體數量最大時是否清除。
            memoryStoreEvictionPolicy:可選策略有:LRU(最近最少使用,預設策略)、FIFO(先進先出)、LFU(最少訪問次數)。
            FIFO,first in first out,這個是大家最熟的,先進先出。
            LFU, Less Frequently Used,就是上面例子中使用的策略,直白一點就是講一直以來最少被使用的。如上面所講,快取的元素有一個hit屬性,hit值最小的將會被清出快取。
            LRU,Least Recently Used,最近最少使用的,快取的元素有一個時間戳,當快取容量滿了,而又需要騰出地方來快取新的元素的時候,那麼現有快取元素中時間戳離當前時間最遠的元素將被清出快取。
         -->
      
      </ehcache>
      

相關文章