框架:mybatis的缓存机制
一級緩存是SqlSession級別的緩存。在操作數(shù)據(jù)庫時需要構(gòu)造 sqlSession對象,在對象中有一個(內(nèi)存區(qū)域)數(shù)據(jù)結(jié)構(gòu)(HashMap)用于存儲緩存數(shù)據(jù)。不同的sqlSession之間的緩存數(shù)據(jù)區(qū)域(HashMap)是互相不影響的。
一級緩存的作用域是同一個SqlSession,在同一個sqlSession中兩次執(zhí)行相同的sql語句,第一次執(zhí)行完畢會將數(shù)據(jù)庫中查詢的數(shù)據(jù)寫到緩存(內(nèi)存),第二次會從緩存中獲取數(shù)據(jù)將不再從數(shù)據(jù)庫查詢,從而提高查詢效率。
當(dāng)一個sqlSession結(jié)束后該sqlSession中的一級緩存也就不存在了。Mybatis默認開啟一級緩存。
二級緩存是mapper級別的緩存,多個SqlSession去操作同一個Mapper的sql語句,多個SqlSession去操作數(shù)據(jù)庫得到數(shù)據(jù)會存在二級緩存區(qū)域,多個SqlSession可以共用二級緩存,二級緩存是跨SqlSession的。
?二級緩存是多個SqlSession共享的,其作用域是mapper的同一個namespace,不同的sqlSession兩次執(zhí)行相同namespace下的sql語句且向sql中傳遞參數(shù)也相同即最終執(zhí)行相同的sql語句,第一次執(zhí)行完畢會將數(shù)據(jù)庫中查詢的數(shù)據(jù)寫到緩存(內(nèi)存),第二次會從緩存中獲取數(shù)據(jù)將不再從數(shù)據(jù)庫查詢,從而提高查詢效率。
Mybatis默認沒有開啟二級緩存。需要在setting全局參數(shù)中配置開啟二級緩存。
避免使用二級緩存(可能會讀到臟數(shù)據(jù))(一個sessionA讀到了另一個sessionB的修改數(shù)據(jù),然后sessionB發(fā)生了回滾)
也就是說,二級緩存它有數(shù)據(jù)的多session共享機制,但是呢,會導(dǎo)致user在兩個命名空間下的數(shù)據(jù)不一致。
針對一個表的某些操作不在他獨立的namespace下進行。
例如在UserMapper.xml中有大多數(shù)針對user表的操作。但是在一個XXXMapper.xml中,還有針對user單表的操作。
這會導(dǎo)致user在兩個命名空間下的數(shù)據(jù)不一致。如果在UserMapper.xml中做了刷新緩存的操作,在XXXMapper.xml中緩存仍然有效,如果有針對user的單表查詢,使用緩存的結(jié)果可能會不正確。
更危險的情況是在XXXMapper.xml做了insert,update,delete操作時,會導(dǎo)致UserMapper.xml中的各種操作充滿未知和風(fēng)險。
?
總結(jié)
以上是生活随笔為你收集整理的框架:mybatis的缓存机制的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 框架:Mybatis中使用sql几种特殊
- 下一篇: 框架:Hibernate和Mybatis