MyBatis 快取詳解
阿新 • • 發佈:2022-03-30
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的生命週期