Mybatis 快取原理及失效情況解析
阿新 • • 發佈:2020-01-07
這篇文章主要介紹了Mybatis 快取原理及失效情況解析,文中通過示例程式碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
1、什麼是快取[Cache]
- 存在記憶體中的臨時資料。
- 將使用者經常查詢的資料放在快取(記憶體)中,使用者去查詢資料就不用從磁碟上(關係型資料庫資料檔案)查詢,從快取中查詢,從而提高查詢效率,解決了高併發系統的效能問題。
2、為什麼要使用快取
減少和資料庫的互動次數,減少系統開銷,提高系統效率。
3、什麼樣的資料需要使用快取
經常查詢且不易改變的資料
4、Mybatis快取
- MyBatis包含一個非常強大的查詢快取特性,它可以非常方便地定製和配置快取。快取可以極大的提升查詢效率。
- MyBatis系統中預設定義了兩級快取:一級快取和二級快取
- 預設情況下,只有一級快取開啟。(SqlSession級別的快取,也稱為本地快取)
- 二級快取需要手動開啟和配置,他是基於namespace級別的快取。
- 為了提高擴充套件性,MyBatis定義了快取介面Cache。我們可以通過實現Cache介面來自定義二級快取
5、一級快取
一級快取也叫本地快取:
- 與資料庫同一次會話期間查詢到的資料會放在本地快取中。
- 以後如果需要獲取相同的資料,直接從快取中拿,沒必須再去查詢資料庫;
6、一級快取失效的四種情況
- sqlSession不同
- sqlSession相同,查詢條件不同
- sqlSession相同,兩次查詢之間執行了增刪改操作!
- sqlSession相同,手動清除一級快取
@Test public void testQueryUserById(){ SqlSession session = MybatisUtils.getSession(); UserMapper mapper = session.getMapper(UserMapper.class); User user = mapper.queryUserById(1); System.out.println(user); session.clearCache();//手動清除快取 User user2 = mapper.queryUserById(1); System.out.println(user2); System.out.println(user==user2); session.close(); }
所以說,一級快取就是一個map
7、二級快取
- 二級快取也叫全域性快取,一級快取作用域太低了,所以誕生了二級快取
- 基於namespace級別的快取,一個名稱空間,對應一個二級快取;
- 工作機制
- 一個會話查詢一條資料,這個資料就會被放在當前會話的一級快取中;
- 如果當前會話關閉了,這個會話對應的一級快取就沒了;但是我們想要的是,會話關閉了,一級快取中的資料被儲存到二級快取中;
- 新的會話查詢資訊,就可以從二級快取中獲取內容;
- 不同的mapper查出的資料會放在自己對應的快取(map)中;
使用步驟:
核心配置檔案
<setting name="cacheEnabled" value="true"/>
去每個mapper.xml中配置使用二級快取,這個配置非常簡單;
方式一:
<cache/>
方式二:
<cache eviction="FIFO" flushInterval="60000" size="512" readOnly="true"/>
這個更高階的配置建立了一個 FIFO 快取,每隔 60 秒重新整理,最多可以儲存結果物件或列表的 512 個引用,而且返回的物件被認為是隻讀的,因此對它們進行修改可能會在不同執行緒中的呼叫者產生衝突。
8、結論
只要開啟了二級快取,我們在同一個Mapper中的查詢,可以在二級快取中拿到資料
查出的資料都會被預設先放在一級快取中
只有會話提交或者關閉以後,一級快取中的資料才會轉到二級快取中
原理圖:
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。