mybatis 缓存总结以及遇到的问题
轉載自https://blog.csdn.net/yin767833376/article/details/80537695
一級緩存
?
MyBatis?默認開啟了一級緩存,一級緩存是在SqlSession 層面進行緩存的。即,同一個SqlSession ,多次調用同一個Mapper和同一個方法的同一個參數,只會進行一次數據庫查詢,然后把數據緩存到緩沖中,以后直接先從緩存中取出數據,不會直接去查數據庫。
? 但是不同的SqlSession對象,因為不同的SqlSession都是相互隔離的,所以相同的Mapper、參數和方法,他還是會再次發送到SQL到數據庫去執行,返回結果。
?
?
二級緩存
??????二級緩存是mapper級別的緩存,它的實現機制跟一級緩存差不多,也是基于PerpetualCache的HashMap本地存儲。作用域為mapper的namespace,可以自定義存儲,比如Ehcache。Mybatis的二級緩存是跨Session的,每個Mapper享有同一個二級緩存域.?
Mybatis內部存儲緩存使用一個HashMap,key為hashCode+sqlId+Sql語句。value為從查詢出來映射生成的Java對象。
?
?
二級緩存是需要配置來開啟的:
<setting name="cacheEnabled" value="true"/>- 1
非常簡單,在Mybatis的核心配置文件中加上上面這行代碼,然后在Mapper映射文件中添加一行:
<cache eviction="FIFO" flushInterval="60000" size="512" readOnly="true"/>- 1
表示開啟二級緩存,flushInterval(刷新間隔)可以被設置為任意的正整數,而且它們代表一個合理的毫秒形式的時間段。默認情況是不設置,也就是沒有刷新間隔,緩存僅僅調用語句時刷新。 size(引用數目)可以被設置為任意正整數,要記住你緩存的對象數目和你運行環境的可用內存資源數目。默認值是1024。 readOnly(只讀)屬性可以被設置為true或false。?
只讀的緩存會給所有調用者返回緩存對象的相同實例。因此這些對象不能被修改。這提供了很重要的性能優勢。可讀寫的緩存會返回緩存對象的拷貝(通過序列化)。這會慢一些,但是安全,因此默認是false。
如果已經開啟二級緩存的mapper里面某個查詢不需要緩存,可以使用useCache=”false”禁用二級緩存:
<select id="selectByPrimaryKey" resultMap="BaseResultMap" parameterType="java.lang.String" useCache="false">?
刷新緩存:?
在mapper的同一個namespace中,如果有其他insert、update、delete操作后都需要執行刷新緩存操作,來避免臟讀。?
這時我們只需要設置statement配置中的flushCache=“true“屬性,就會默認刷新緩存,相反如果是false就不會了。?
當然,不管開不開緩存刷新功能,你要是手動更改數據庫表,那都肯定不能避免臟讀的發生,那就屬于手賤了。
??????無論是一級緩存還是二級緩存,C/U/D增刪改操作commit提交后會清空緩存區域,使緩存失效。合理利用二級緩存可以提高系統性能,減少數據庫壓力。但是,如果使用不當可那個會出現緩存一致性問題,對查詢結果實時性要求不高,此時可采用mybatis二級緩存技術降低數據庫訪問量,提高訪問速度。
?
mybatis在一個事物中獲取oracle中的sequence,一開始沒有問題,每次都返回不同的值,運行幾天之后,批量處理三條數據,返回的是同一個sequence;
mybatis ?xml文件中的sql如下:
?
以下四種解決方法,本人用的第二種:
1.拿出@Transactional,就不會出錯。
2.加上useCache="false" flushCache="true",不保存在二級緩存中,并清空緩存
3.mybatis.configuration.localCacheScope=STATEMENT,修改一級緩存的作用域
4.mybatis.configuration.cacheEnabled = false,禁用一級和二級緩存
?
?
mybatis在一個事物中獲取oracle中的sequence,一開始沒有問題,每次都返回不同的值,運行幾天之后,批量處理三條數據,返回的是同一個sequence;
超強干貨來襲 云風專訪:近40年碼齡,通宵達旦的技術人生總結
以上是生活随笔為你收集整理的mybatis 缓存总结以及遇到的问题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java中实现同步的两种方式:sysch
- 下一篇: 分布式事务理论(学习笔记)