1. 程式人生 > 其它 >pytest -mark標記

pytest -mark標記

簡介

MyBatis 包含一個非常強大的查詢快取特性,它可以非 常方便地配置和定製。快取可以極大的提升查詢效率。

MyBatis 系統中預設定義了兩級快取,也就是一級快取和二級快取

  • 預設情況下,只有一級快取(SqlSession 級別的快取,也稱為本地快取)開啟
  • 二級快取需要手動開啟和配置,它是基於 namespace 級別的快取。
  • 為了挺高擴充套件性,MyBatis 定義了快取介面 Cache。我們可以通過實現 Cache 介面來自定義二級快取。

一級快取

一級快取(local cache), 即本地快取, 作用域預設 為sqlSession。當 Session flush 或 close 後, 該 Session 中的所有 Cache 將被清空。

本地快取不能被關閉, 但可以呼叫 clearCache() 來清空本地快取, 或者改變快取的作用域。

在mybatis3.1之後,可以配置本地快取的作用域, 在 mybatis.xml 中配置。

案例演示

同一次會話期間只要查詢過的資料都會儲存在當 前SqlSession的一個Map中:

key:hashCode + 查詢的 SqlId + 編寫的sql查詢語句 + 引數

一級快取失效

  • sqlSession 不同。
  • sqlSession 相同,查詢條件不同。
  • sqlSession 相同,但是查詢期間執行了增刪改操作。
  • sqlSession 相同,手動清除了一級快取(快取清空)。

二級快取

二級快取(second level cache),全域性作用域快取,基於 namespace 級別的快取;一個 namespace 對應一個二級快取;

工作機制

  1. 一個會話,查詢一條資料,這個資料就會被放到當前會話的一級快取中;
  2. 如果會話關閉;那麼一級快取中的資料會被儲存到二級快取中;新的會話查詢資訊,就可以參照二級快取。
  3. 不同 namespace 查出的資料會放在自己對應的快取 map 中。

使用步驟

  1. 開啟全域性二級快取配置:

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

    <!--  
     size:快取存放多少元素;
     type="":指定自定義快取的全類名;
       實現Cache介面即可;
     -->
    <!-- <cache eviction="FIFO" flushInterval="60000" readOnly="false" size="1024"></cache> -->
    
    • eviction(快取的回收策略):
      • LRU – 最近最少使用的:移除最長時間不被使用的物件。
      • FIFO – 先進先出:按物件進入快取的順序來移除它們。
      • SOFT – 軟引用:移除基於垃圾回收器狀態和軟引用規則的物件。
      • WEAK – 弱引用:更積極地移除基於垃圾收集器狀態和弱引用規則的物件。
      • 預設的是 LRU。
    • flushInterval(快取重新整理間隔):
      • 快取多長時間清空一次,預設不清空,設定一個毫秒值
    • readOnly(是否只讀):
      • true(只讀):
        • mybatis認為所有從快取中獲取資料的操作都是隻讀操作,不會修改資料。
        • mybatis為了加快獲取速度,直接就會將資料在快取中的引用交給使用者。不安全,速度快
      • false(非只讀):
        • mybatis覺得獲取的資料可能會被修改。
        • mybatis會利用序列化&反序列的技術克隆一份新的資料給你。安全,速度慢
  3. pojo 類需要實現序列化介面;

快取相關的配置

  • cacheEnabled=true:false:關閉快取(二級快取關閉)(一級快取一直可用的)
  • 每個select標籤都有 useCache="true":
    • false:不使用快取(一級快取依然使用,二級快取不使用)
  • 【每個增刪改標籤的:flushCache="true":(一級二級都會清除)】
    • 增刪改執行完成後就會清楚快取;
    • 測試:flushCache="true":一級快取就清空了;二級也會被清除;
    • 查詢標籤:flushCache="false";
    • 如果 flushCache=true;每次查詢之後都會清空快取;快取是沒有被使用的;
  • sqlSession.clearCache();只是清楚當前session的一級快取;
  • localCacheScope:本地快取作用域:(一級快取SESSION);當前會話的所有資料儲存在會話快取中;
    STATEMENT:可以禁用一級快取;