MyBatis之一級緩存和二級緩存問題
MyBatis緩存介紹
MyBatis 是一款優(yōu)秀的持久層框架,它提供了緩存功能來減少數據查詢時的數據庫交互次數,從而提高查詢性能。
MyBatis 的緩存分為一級緩存和二級緩存兩種類型。
緩存分類
- 根據緩存存放位置,緩存可以分為本地緩存和分布式緩存。
- 根據緩存作用范圍,緩存可以分為永久緩存和臨時緩存。
在 MyBatis 中,根據作用范圍,分別有一級緩存和二級緩存兩種類型。
一級緩存與二級緩存的區(qū)別
1.作用范圍
- 一級緩存的作用范圍是 SqlSession 的生命周期
- 二級緩存的作用范圍是整個應用程序的生命周期
2.實現方式
- 一級緩存是通過 SqlSession 內置的一個 HashMap 來實現的
- 而二級緩存則是通過配置 Cache 接口來實現的
3.共享機制
- 一級緩存只能在同一個 SqlSession 內部共享
- 二級緩存可以在多個 SqlSession 之間共享
4.緩存規(guī)則
- 一級緩存默認開啟并且無法關閉;
- 二級緩存需要手動開啟并進行配置
MyBatis緩存原理
MyBatis 的緩存本質上是一個 HashMap,它的鍵是查詢語句和參數的組合,值是查詢結果。
當我們執(zhí)行一個查詢時,MyBatis 會先從緩存中查找對應的查詢結果,如果緩存中存在,則直接返回緩存的結果;如果緩存中不存在,則從數據庫中查詢數據,并將查詢結果存入緩存中。
每個 SqlSession 都有自己的緩存,因此在不同的 SqlSession 中執(zhí)行同一個查詢語句,它們所使用的緩存是不同的。
同時,MyBatis 的緩存是基于引用計數的機制實現的,當查詢語句被多次引用時,緩存的引用計數會加 1,只有當引用計數為 0 時,緩存才會被真正的清除。
使用緩存
1.一級緩存的使用
在同一個 SqlSession 中,同樣的 SQL 查詢只會執(zhí)行一次,并把查詢結果緩存到 SqlSession 內置的 HashMap 中。
下面是示例代碼:
SqlSession sqlSession = sqlSessionFactory.openSession(); UserMapper userMapper = sqlSession.getMapper(UserMapper.class); User user1 = userMapper.selectUserById(1); User user2 = userMapper.selectUserById(1); System.out.println(user1 == user2); // true sqlSession.close();
2.二級緩存的使用
需要在 XML 映射文件中添加 <cache>
標簽來開啟二級緩存,并指定緩存實現類。
下面是示例代碼:
<cache/>
需要注意的是,如果要使用二級緩存,需要讓你的實體類實現 Serializable 接口。
緩存的使用場景
緩存的使用場景主要包括以下兩種情況:
1.某些數據被經常訪問
- 如果某些數據經常被訪問,
- 那么將這些數據緩存起來,
- 可以減少數據庫交互次數,提高系統(tǒng)性能。
2.數據存儲較大,查詢耗時較長
- 如果某些數據存儲較大,且查詢這些數據的效率比較低
- 那么可以將查詢結果緩存下來,
- 下次需要查詢時,直接從緩存中讀取。
總結
以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
MyBatis動態(tài)SQL中的trim標簽的使用方法
這篇文章主要介紹了MyBatis動態(tài)SQL中的trim標簽的使用方法,需要的朋友可以參考下2017-05-05解決SpringBoot打成jar運行后無法讀取resources里的文件問題
這篇文章主要介紹了解決SpringBoot打成jar運行后無法讀取resources里的文件問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-08-08Java并發(fā)系列之AbstractQueuedSynchronizer源碼分析(條件隊列)
這篇文章主要為大家詳細介紹了Java并發(fā)系列之AbstractQueuedSynchronizer源碼,具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-02-02