【Mybatis框架】查詢快取(一級快取)
做java的各位程式設計師們,估計SSH和SSM是我們的基礎必備框架。也就是說我們都已經至少接觸過了這兩套常見的整合框架。當我們用SSH的時候,相信很多人都接觸過Hibernate的兩級快取,同樣,相對應的,Mybatis也存在著兩級快取。接下來,我們就來介紹一下Mybatis的一、二級快取。
首先我們要知道什麼是查詢快取?查詢快取又有什麼作用?
功能:mybatis提供查詢快取,用於減輕資料壓力,提高資料庫效能。
用圖來表示如下圖:
粗略的解釋一下就是:
一級快取是SqlSession級別的快取。在操作資料庫時需要構造 sqlSession物件,在物件中有一個數據結構(HashMap)用於儲存快取資料。不同的sqlSession之間的快取資料區域(HashMap)是互相不影響的。所以在這種情況下,是不能實現跨表的session共享的
二級快取是mapper級別的快取,多個SqlSession去操作同一個Mapper的sql語句,多個SqlSession可以共用二級快取,二級快取是橫跨跨SqlSession的。相信不用我再給大家去解釋什麼事Mapper了吧!那我們就先說一下Mybatis的一級快取
畫一個簡單的圖吧:
這個圖好像有點顯眼啊,就這樣吧先。首先從圖上,我們可以看出,一級快取區域是根據SqlSession為單位劃分的。每次查詢都會先從快取區與找,如果找不到就會從資料庫查詢資料,然後將查詢到的資料寫入一級快取中。Mybatis內部儲存快取使用一個HashMap,key為hashCode+sqlId+sql語句。而value值就是從查詢出來對映生成的java物件。而為了保證快取裡面的資料肯定是準確資料避免髒讀,每次我們進行資料修改後(增刪改)就會執行commit操作,清空快取區域。
說到這裡,我們來做一下測試:
//獲取session SqlSession session = sqlSessionFactory.openSession(); //獲限mapper介面例項 UserMapper userMapper = session.getMapper(UserMapper.class); //第一次查詢 User user1 = userMapper.findUserById(1); System.out.println(user1); //第二次查詢,由於是同一個session則不再向資料發出語句直接從快取取出 User user2 = userMapper.findUserById(1); System.out.println(user2); //關閉session session.close();
結果圖:
而當我們提交Commit之後呢?
//獲取session SqlSession session = sqlSessionFactory.openSession(); //獲限mapper介面例項 UserMapper userMapper = session.getMapper(UserMapper.class); //第一次查詢 User user1 = userMapper.findUserById(1); System.out.println(user1); //在同一個session執行更新 User user_update = new User(); user_update.setId(1); user_update.setUsername("張三"); userMapper.updateUser(user_update); session.commit(); //第二次查詢,雖然是同一個session但是由於執行了更新操作session的快取被清空,這裡重新發出sql操作 User user2 = userMapper.findUserById(1); System.out.println(user2);
效果圖
由此可見,Mybatis的一級快取是存在與SqlSession中,可以提高我們的查詢效能,但是不能實現多sql的session的共享。