mybatis学习8之缓存
生活随笔
收集整理的這篇文章主要介紹了
mybatis学习8之缓存
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
mybatis緩存
MyBatis 內置了一個強大的事務性查詢緩存機制,當你查詢了一次數據時,他會保存到緩存中,當你第二次查詢這個數據時,它不會去數據庫查找,而是直接從緩存中去取!
一級緩存
默認情況下,只啟用了本地的會話緩存,它僅僅對一個會話中的數據進行緩存。可以理解為sqlsession級別的!
@Testpublic void queryUserById(){SqlSession sqlSession = MybatisUtils.getSqlSession();UserMapper mapper = sqlSession.getMapper(UserMapper.class);User user = mapper.queryUserById(1);//第一次查詢1號用戶System.out.println("第一次查詢1號用戶user為"+user);System.out.println("---------------------------------------------------------------------");User user2 = mapper.queryUserById(1);//第二次查詢1號用戶System.out.println("第二次查詢1號用戶user2為"+user2);System.out.println("---------------------------------------------------------------------");System.out.println("user==user2為"+(user==user2));//數據庫只查詢了一次sqlSession.close();}數據庫只查詢了一次
二級緩存(xml級別)
要啟用全局的二級緩存,只需要在你的 SQL 映射文件中添加一行:
<cache/>基本上就是這樣。這個簡單語句的效果如下:
- 映射語句文件中的所有 select 語句的結果將會被緩存。
- 映射語句文件中的所有 insert、update 和 delete 語句會刷新緩存。
- 緩存會使用最近最少使用算法(LRU, Least Recently Used)算法來清除不需要的緩存。
- 緩存不會定時進行刷新(也就是說,沒有刷新間隔)。 緩存會保存列表或對象(無論查詢方法返回哪種)的 1024 個引用。
- 緩存會被視為讀/寫緩存,這意味著獲取到的對象并不是共享的,可以安全地被調用者修改,而不干擾其他調用者或線程所做的潛在修改。
緩存失效原因
@Testpublic void cache(){SqlSession sqlSession = MybatisUtils.getSqlSession();UserMapper mapper = sqlSession.getMapper(UserMapper.class);User user = mapper.queryUserById(1);//第一次查詢1號用戶System.out.println("第一次查詢1號用戶user為"+user);//mapper.updateUser(new User(2, "aaa", "a123bbb"));//修改操作sqlSession.clearCache();//手動清理緩存System.out.println("---------------------------------------------------------------------");User user2 = mapper.queryUserById(1);//第二次查詢1號用戶System.out.println("第二次查詢1號用戶user2為"+user2);System.out.println("---------------------------------------------------------------------");System.out.println("user==user2為"+(user==user2));//false 數據庫查詢了2次/*緩存失效的原因:1.查詢不同的東西2.增刪改查操作可能會改變原有的數量,所有必定刷新緩存3.查詢不同的Mapper.xml4.手動清理緩存*/sqlSession.close();//一級緩存是默認開啟,只在sqlSession中有效。}數據庫查詢了兩次
開啟二級緩存效果
public void cache2(){//開啟二級緩存SqlSession sqlSession = MybatisUtils.getSqlSession();SqlSession sqlSession2 = MybatisUtils.getSqlSession();UserMapper mapper = sqlSession.getMapper(UserMapper.class);User user = mapper.queryUserById(1);//sqlSession第一次查詢1號用戶System.out.println("第一次查詢1號用戶user為"+user);System.out.println("---------------------------------------------------------------------");sqlSession.close();//關閉后,一級緩存里面就沒有了,提交到二級緩存UserMapper mapper2 = sqlSession2.getMapper(UserMapper.class);User user2 = mapper2.queryUserById(1);//sqlSession2查詢1號用戶,從二級緩存里獲取System.out.println("第二次查詢1號用戶user2為"+user2);System.out.println("---------------------------------------------------------------------");sqlSession2.close();//順序:用戶先從二級緩存取,在到一級緩存,都沒有就去查詢數據庫}數據庫只查詢了一次
原理
用戶查詢數據時先通過二級緩存,然后在到一級緩存,最后都沒有就去數據庫查詢。
作者有話說
博客創作不易,希望看到這里的讀者動動你的小手點個贊,如果喜歡的小伙伴可以一鍵三連,作者大大在這里給大家謝謝了。
總結
以上是生活随笔為你收集整理的mybatis学习8之缓存的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mybatis学习7之动态sql
- 下一篇: Spring学习1之ioc