慣例,不介紹概念,這裏記錄需要記錄的要點:
-
緩存通過HashMap實現
-
一級緩存作用域是sqlSession,默認開啓,在高併發或者分佈式(每個節點有自己的緩存)的情況下會產生髒數據。所以建議
-
一級緩存級別調成 statement,每次查詢結束都會清掉一級緩存
mybatis集合spring一級緩存失效問題:
https://www.cnblogs.com/zemliu/p/3239014.html
在未開啓事務的情況之下,每次查詢,spring都會關閉舊的sqlSession而創建新的sqlSession,因此此時的一級緩存是沒有啓作用的
在開啓事務的情況之下,spring使用threadLocal獲取當前資源綁定同一個sqlSession,因此此時一級緩存是有效的 -
二級緩存作用域是namespace,默認也是開啓的(總開關開啓),但需要配置才能生效
-
二級緩存默認會使用(Least Flush Interval,LRU最近最少使用的)算法來收回
-
如果需要開啓二級緩存,resultMap的對應的實體類必須要序列化,不然會報java.io.NotSerializableException
-
映射語句文件中所有的insert update delete語句會刷新緩存
-
數據的查詢順序是 二級緩存 -> 一級緩存 -> 數據庫