1. 程式人生 > >【Mybatis框架】查詢快取(一級快取)

【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的共享。