# 一級緩存 ###### tags: `Mybatis-緩存` 一級緩存也叫做本地緩存 sqlsession級別 * 與數據庫同一次會話期間查詢到的數據會存放在本地緩存中 * 以後如果需要獲取相同的數據,直接從緩存中拿,沒必須再去查詢數據庫 ### 測試步驟: 1.開啟日誌 2.測試在一個Session中查詢兩次相同紀錄 3.查看日誌輸出 在一次sqlsession進行相同id的查詢,會發現第一次還有進行SQL查詢,第二次就直接使用第一次獲得的答案,並且這兩者是相等 ![](https://i.imgur.com/jb9yGDK.png) ### 特性 * 映射语句文件中的所有 select 语句的结果将会被缓存。 * 映射语句文件中的所有 insert、update 和 delete 语句会刷新缓存。 * 缓存会使用最近最少使用算法(LRU, Least Recently Used)算法来清除不需要的缓存。 * 缓存不会定时进行刷新(也就是说,没有刷新间隔)。 * 缓存会保存列表或对象(无论查询方法返回哪种)的 1024 个引用。 * 缓存会被视为读/写缓存,这意味着获取到的对象并不是共享的,可以安全地被调用者修改,而不干扰其他调用者或线程所做的潜在修改。 ### 緩存失效的情況 1.查詢不同東西 ![](https://i.imgur.com/IHWOFs3.png) 2.增刪改操作可能會改變原來的數據,所以必定會刷新 ```java= @Test public void test(){ SqlSession sqlSession = MybatisUtils.getSqlSession(); UserMapper mapper = sqlSession.getMapper(UserMapper.class); User user = mapper.queryUserById(1); System.out.println(user); mapper.updateUser(new User(2,"aaa","bbb")); System.out.println("=================="); User user1 = mapper.queryUserById(1); System.out.println(user1); System.out.println(user == user1); sqlSession.close(); } ``` ![](https://i.imgur.com/bjWedbE.png) 3.查詢不同mapper 4.手動清理緩存 ![](https://i.imgur.com/oSBoWq8.png) ### 小結: 一級緩存默認是開啟的,只在一次SqlSession中有效,也就拿到連接到關閉這個區間段 一級緩存就是一個Map