緩存是計算機中的一塊存儲區域,把數據放入到存儲區域中,讀取速度會很快
- 一級緩存:SqlSession級別的緩存
這個是默認開啟的
因為接着之前的代碼,所以我表映射XML文件就省略了
/Mybatis02/src/test/Start2.java
public class Start2 {
public static void main(String[] args) throws IOException {
String resource = "mybatis-conf.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
//創建SqlSessionFactory
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
//true表示自動提交。否則需要使用commit方法才會提交。默認是false
SqlSession session = sqlSessionFactory.openSession();
//拿到接口的代理對象
GoodsDao2 dao=session.getMapper(GoodsDao2.class);
//拿到了dao這個對象接下來就可以創建sql語句了;(直接調用接口方法)
long s1 = System.currentTimeMillis();
List list = dao.selAll();
System.out.println(list);
long e1 =System.currentTimeMillis();
System.out.println("第一次查詢時間:"+(e1-s1));
//再做一次重復查詢,測試下執行時間
long s2 = System.currentTimeMillis();
List list2 = dao.selAll();
System.out.println(list2);
long e2 =System.currentTimeMillis();
System.out.println("第一次查詢時間:"+(e2-s2));
//如果上面不設置自動提交表單,那么就需要commit方法
session.commit();
}
}
總結:可以看到,第二次查詢的運行時間非常的短。且沒有再次執行SQL語句,它是直接從緩存里拿出來的
- 一級緩存是默認開啟的,當你創建SqlSession對象時候 就開啟了
它是怎么做到的呢,流程圖如下:
原理流程:
當Client客戶發送一條SQL,經過我們的SqlSession對象,那么SqlSession對象把這個處理權交給我們的Executor對象。Executor對象會先在本地緩存中查找是否有你要的這條數據,如果有的話我們直接從緩存中把數據返回給你,如果沒有的話,我們再去數據庫IO操作 讀取數據,讀取完成之后,會把數據返回給Executor執行器對象,那么接着我們這個Executor執行器對象會把拿到的數據放在本地緩存中,方便你下次查詢。最終再把結果返回給Client客戶。
一級緩存中數據的有效期(即緩存情況下會清除掉)
- 1.1一級緩存中數據的有效期
1.1.1當不是同一個SqlSession對象的時候(s1,s2)
s1中緩存的數據 s2不能使用的
1.1.2當SqlSession對象調用.clearCache()方法的時候,會自動清除緩存中的數據。SqlSession對象還是可以正常使用的
1.1.3當SqlSession對象關閉的時候,SqlSession對象就不能再使用了
1.1.4當在兩次相同的查詢中間 穿插了 新增 修改好或者刪除操作,也會清除緩存中的數據
mybatis_一級緩存實現原理及性能分析
- 1.2一級緩存實現原理及性能分析
1.2.1一級緩存通過簡單Map集合來實現,並沒有對Map集合的大小,容量進行限制
1.2.2一級緩存它是一個粗粒度的緩存,沒有辦法去精確控制緩存中的數據是否過期以及去更新緩存數據
1.2.3多個SqlSession對象緩存中的數據無法共享(因為這個原因所以有了二級緩存的概念)
什么是二級緩存 ?請聽下回分解