MyBatis一級與二級緩存相關(guān)配置
1.MyBatis的一級緩存
一級緩存是 SqlSession 級別的,通過同一個 SqlSession 查詢的數(shù)據(jù)會被緩存,下次查詢相同的數(shù)據(jù),就 會從緩存中直接獲取,不會從數(shù)據(jù)庫重新訪問
使一級緩存失效的四種情況:
- 不同的SqlSession對應不同的一級緩存
- 同一個SqlSession但是查詢條件不同
- 同一個SqlSession兩次查詢期間執(zhí)行了任何一次增刪改操作
- 同一個SqlSession兩次查詢期間手動清空了緩存( sqlSession.clearCache();)
案例:
public void test(){ SqlSessionUtils sqlSessionUtils1 = new SqlSessionUtils(); SqlSession sqlSession1 = sqlSessionUtils1.getSqlSession(); EmpMapper mapper1 = sqlSession1.getMapper(EmpMapper.class); Emp empById1 = mapper1.getEmpById(1); System.out.println(empById1); Emp empById2 = mapper1.getEmpById(1); System.out.println(empById2); SqlSession sqlSession2 = sqlSessionUtils1.getSqlSession(); EmpMapper mapper2 = sqlSession2.getMapper(EmpMapper.class); Emp empById3 = mapper2.getEmpById(1); System.out.println(empById3); }
empById1,empById2 共用一個sqlSession1 因為存在一級緩存,所以只執(zhí)行一次SQL
empById3 用的是sqlSession2 (不同的SqlSession對應不同的一級緩存),故會重新執(zhí)行SQL
2.MyBatis的二級緩存
二級緩存是 SqlSessionFactory 級別,通過同一個 SqlSessionFactory 創(chuàng)建的 SqlSession 查詢的結(jié)果會被 緩存;此后若再次執(zhí)行相同的查詢語句,結(jié)果就會從緩存中獲取
二級緩存開啟的條件:
- a>在核心配置文件中,設(shè)置全局配置屬性cacheEnabled="true",默認為true,不需要設(shè)置
- b>在映射文件中設(shè)置標簽<cache/>
- c>二級緩存必須在SqlSession關(guān)閉或提交之后有效
- d>查詢的數(shù)據(jù)所轉(zhuǎn)換的實體類類型必須實現(xiàn)序列化的接口
使二級緩存失效的情況:
- 兩次查詢之間執(zhí)行了任意的增刪改,會使一級和二級緩存同時失效
3.二級緩存的相關(guān)配置
在 mapper 配置文件中添加的 cache 標簽可以設(shè)置一些屬性:
① eviction 屬性:緩存回收策略,默認的是 LRU 。
- LRU(Least Recently Used) – 最近最少使用的:移除最長時間不被使用的對象。
- FIFO(First in First out) – 先進先出:按對象進入緩存的順序來移除它們。
- SOFT – 軟引用:移除基于垃圾回收器狀態(tài)和軟引用規(guī)則的對象。
- WEAK – 弱引用:更積極地移除基于垃圾收集器狀態(tài)和弱引用規(guī)則的對象。
② flushInterval 屬性:刷新間隔,單位毫秒
- 默認情況是不設(shè)置,也就是沒有刷新間隔,緩存僅僅調(diào)用語句時刷新
③ size 屬性:引用數(shù)目,正整數(shù)
- 代表緩存最多可以存儲多少個對象,太大容易導致內(nèi)存溢出
④ readOnly 屬性:只讀, true/false
- true:只讀緩存;會給所有調(diào)用者返回緩存對象的相同實例。因此這些對象不能被修改。這提供了很重 要的性能優(yōu)勢。
- false:讀寫緩存;會返回緩存對象的拷貝(通過序列化)。這會慢一些,但是安全,因此默認是 false。
4.MyBatis緩存查詢的順序
先查詢二級緩存,因為二級緩存中可能會有其他程序已經(jīng)查出來的數(shù)據(jù),可以拿來直接使用。
如果二級緩存沒有命中,再查詢一級緩存
如果一級緩存也沒有命中,則查詢數(shù)據(jù)庫
SqlSession 關(guān)閉之后,一級緩存中的數(shù)據(jù)會寫入二級緩存
到此這篇關(guān)于MyBatis一級與二級緩存相關(guān)配置的文章就介紹到這了,更多相關(guān)MyBatis緩存內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java實現(xiàn)聯(lián)系人管理系統(tǒng)
這篇文章主要為大家詳細介紹了Java實現(xiàn)聯(lián)系人管理系統(tǒng),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-02-02java 使用poi 導入Excel數(shù)據(jù)到數(shù)據(jù)庫的步驟
這篇文章主要介紹了java 使用poi 導入Excel 數(shù)據(jù)到數(shù)據(jù)庫的步驟,幫助大家更好的理解和使用Java,感興趣的朋友可以了解下2020-12-12Mybatis動態(tài)調(diào)用表名和字段名的解決方法
今天在項目開發(fā)中有個業(yè)務是需要限制各個用戶對某些表里的字段查詢以及某些字段是否顯示,這種情況下,就需要構(gòu)建sql來動態(tài)傳入表名、字段名了,下面給大家介紹mybatis動態(tài)調(diào)用表名和字段名的解決方法,一起看看吧2016-10-10