MyBatis 缓存详解-一级缓存验证
生活随笔
收集整理的這篇文章主要介紹了
MyBatis 缓存详解-一级缓存验证
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
(基于mybatis-standalone 工程,注意演示一級緩存需要先關閉二級緩存,localCacheScope 設置為SESSION)
判斷是否命中緩存:如果再次發送SQL 到數據庫執行,說明沒有命中緩存;如果直接打印對象,說明是從內存緩存中取到了結果。
1、在同一個session 中共享
BlogMapper mapper = session.getMapper(BlogMapper.class); System.out.println(mapper.selectBlog(1)); System.out.println(mapper.selectBlog(1));2、不同session 不能共享
SqlSession session1 = sqlSessionFactory.openSession(); BlogMapper mapper1 = session1.getMapper(BlogMapper.class); System.out.println(mapper.selectBlog(1));PS:一級緩存在BaseExecutor 的query()——queryFromDatabase()中存入。在queryFromDatabase()之前會get()。
3、同一個會話中,update(包括delete)會導致一級緩存被清空
mapper.updateByPrimaryKey(blog); session.commit(); System.out.println(mapper.selectBlogById(1));一級緩存是在BaseExecutor 中的update()方法中調用clearLocalCache()清空的(無條件),query 中會判斷。
如果跨會話,會出現什么問題?
4、其他會話更新了數據,導致讀取到臟數據(一級緩存不能跨會話共享)
// 會話2 更新了數據,會話2 的一級緩存更新 BlogMapper mapper2 = session2.getMapper(BlogMapper.class); mapper2.updateByPrimaryKey(blog); session2.commit(); // 會話1 讀取到臟數據,因為一級緩存不能跨會話共享 System.out.println(mapper1.selectBlog(1));?
總結
以上是生活随笔為你收集整理的MyBatis 缓存详解-一级缓存验证的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: MyBatis 缓存详解-一级缓存(本地
- 下一篇: MyBatis 缓存详解-一级缓存的不足