Mybatis中的一级缓存
生活随笔
收集整理的這篇文章主要介紹了
Mybatis中的一级缓存
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
像大多數的持久化框架一樣,Mybatis也提供了緩存策略,通過緩存策略來減少數據庫的查詢次數,從而提高性能。
Mybatis中緩存分為一級緩存,二級緩存。
證明一級緩存的存在
一級緩存是SqlSession級別的緩存,只要SqlSession沒有flush或close,它就存在。
一級緩存的分析
一級緩存是SqlSession范圍的緩存,當調用SqlSession的修改,添加,刪除,commit(),close()等方法時,就會清空一級緩存。
第一次發起查詢用戶id為1的用戶信息,先去找緩存中是否有id為1的用戶信息,如果沒有,從數據庫查詢用戶信息。
得到用戶信息,將用戶信息存儲到一級緩存中。
如果sqlSession去執行commit操作(執行插入、更新、刪除),清空SqlSession中的一級緩存,這樣做的目的為了讓緩存中存儲的是最新的信息,避免臟讀。
第二次發起查詢用戶id為1的用戶信息,先去找緩存中是否有id為1的用戶信息,緩存中有,直接從緩存中獲取用戶信息。
package com.learn.test;import com.learn.dao.IUserDao; import com.learn.domain.User; import org.apache.ibatis.io.Resources; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.session.SqlSessionFactoryBuilder; import org.junit.After; import org.junit.Before; import org.junit.Test;import java.io.InputStream;public class UserTest {private InputStream in;private SqlSessionFactory factory;private SqlSession sqlSession;private IUserDao userDao;@Before//用于在測試方法執行之前執行public void init()throws Exception{//1.讀取配置文件,生成字節輸入流in = Resources.getResourceAsStream("SqlMapConfig.xml");//2.獲取SqlSessionFactoryfactory = new SqlSessionFactoryBuilder().build(in);//3.獲取SqlSession對象sqlSession = factory.openSession(true);//4.獲取dao的代理對象userDao = sqlSession.getMapper(IUserDao.class);}@After//用于在測試方法執行之后執行public void destroy()throws Exception{//提交事務// sqlSession.commit();//6.釋放資源sqlSession.close();in.close();}/*** 測試一級緩存*/@Testpublic void testFirstLevelCache(){User user1 = userDao.findById(41);System.out.println(user1);// sqlSession.close(); // 再次獲取SqlSession對象 // sqlSession = factory.openSession();sqlSession.clearCache();//此方法也可以清空緩存userDao = sqlSession.getMapper(IUserDao.class);User user2 = userDao.findById(41);System.out.println(user2);System.out.println(user1 == user2);}/*** 測試緩存的同步*/@Testpublic void testClearlCache(){// 1.根據id查詢用戶User user1 = userDao.findById(41);System.out.println(user1);// 2.更新用戶信息user1.setUsername("update user clear cache");user1.setAddress("北京市海淀區");userDao.updateUser(user1);// 3.再次查詢id為41的用戶User user2 = userDao.findById(41);System.out.println(user2);System.out.println(user1 == user2);} }?
總結
以上是生活随笔為你收集整理的Mybatis中的一级缓存的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 百万数据报表读取:解决方案及原理分析
- 下一篇: mybatis的二级缓存