1. 程式人生 > 其它 >MyBatis 快取詳解

MyBatis 快取詳解

https://www.cnblogs.com/wuzhenzhao/p/11103043.html

一級快取

  • Mybatis的一級快取存放在SqlSession的生命週期,在同一個SqlSession中查詢時,Mybatis會把執行的方法和引數通過演算法生成快取的鍵值,將鍵值和查詢結果存入一個Map物件中。如果同一個SqlSession中執行的方法和引數完全一致,那麼通過演算法會生成相同的鍵值,當Map快取物件中已經存在改鍵值時,則會返回快取中的物件。(一個SqlSession連續兩次查詢 得到的是同一個java物件)
  • 任何的insert update delete操作都會清空一級快取(增刪改任何記錄都會清空當前SqlSession的快取)。
  • Spring整合Mybatis的時候一級快取的問題:(預設一級快取是開啟的

      在未開啟事物的情況之下(@Transactional),每次查詢,spring都會關閉舊的sqlSession而建立新的sqlSession,因此此時的一級快取是沒有啟作用的

      在開啟事物的情況之下(@Transactional),spring使用threadLocal獲取當前資源繫結同一個sqlSession,因此此時一級快取是有效的

  • 總結: 一級快取就是mapper.aaa(c,d)。 同一mapper 同一方法 同一引數。 SqlSession連續兩次查詢 得到的是同一個java物件(通過反序列化得到)。
  • 如何實現呢。
  • 利用 ThreadLocal  (當前執行緒變數副本)和 map 實現。 ThreadLocal<Map<Object, Object>>  把 請求方法+引數 通過指定演算法生成key 放到map 中,並把map 放到ThreadLocal 中,當同 同一mapper 同一方法 同一引數 查詢時,會去map中的資料。 然後把資料反序列化出來,就不用和資料庫交付了。
  • https://blog.csdn.net/u013887008/article/details/80379938
  • 二級快取

  • 每個sqlSession都有自己的一級快取,多個sqlSession共享二級快取
  • Mybatis二級快取可以理解為存在SqlSessionFactory的生命週期