日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

mybatis 缓存总结以及遇到的问题

發(fā)布時(shí)間:2024/2/28 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 mybatis 缓存总结以及遇到的问题 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

轉(zhuǎn)載自https://blog.csdn.net/yin767833376/article/details/80537695

一級(jí)緩存

?

MyBatis?默認(rèn)開啟了一級(jí)緩存,一級(jí)緩存是在SqlSession 層面進(jìn)行緩存的。即,同一個(gè)SqlSession ,多次調(diào)用同一個(gè)Mapper和同一個(gè)方法的同一個(gè)參數(shù),只會(huì)進(jìn)行一次數(shù)據(jù)庫查詢,然后把數(shù)據(jù)緩存到緩沖中,以后直接先從緩存中取出數(shù)據(jù),不會(huì)直接去查數(shù)據(jù)庫。

? 但是不同的SqlSession對(duì)象,因?yàn)椴煌腟qlSession都是相互隔離的,所以相同的Mapper、參數(shù)和方法,他還是會(huì)再次發(fā)送到SQL到數(shù)據(jù)庫去執(zhí)行,返回結(jié)果。

?

?

二級(jí)緩存

??????二級(jí)緩存是mapper級(jí)別的緩存,它的實(shí)現(xiàn)機(jī)制跟一級(jí)緩存差不多,也是基于PerpetualCache的HashMap本地存儲(chǔ)。作用域?yàn)閙apper的namespace,可以自定義存儲(chǔ),比如Ehcache。Mybatis的二級(jí)緩存是跨Session的,每個(gè)Mapper享有同一個(gè)二級(jí)緩存域.?

Mybatis內(nèi)部存儲(chǔ)緩存使用一個(gè)HashMap,key為hashCode+sqlId+Sql語句。value為從查詢出來映射生成的Java對(duì)象。

?

?

二級(jí)緩存是需要配置來開啟的:

<setting name="cacheEnabled" value="true"/>
  • 1

非常簡(jiǎn)單,在Mybatis的核心配置文件中加上上面這行代碼,然后在Mapper映射文件中添加一行:

<cache eviction="FIFO" flushInterval="60000" size="512" readOnly="true"/>
  • 1

表示開啟二級(jí)緩存,flushInterval(刷新間隔)可以被設(shè)置為任意的正整數(shù),而且它們代表一個(gè)合理的毫秒形式的時(shí)間段。默認(rèn)情況是不設(shè)置,也就是沒有刷新間隔,緩存僅僅調(diào)用語句時(shí)刷新。 size(引用數(shù)目)可以被設(shè)置為任意正整數(shù),要記住你緩存的對(duì)象數(shù)目和你運(yùn)行環(huán)境的可用內(nèi)存資源數(shù)目。默認(rèn)值是1024。 readOnly(只讀)屬性可以被設(shè)置為true或false。?
只讀的緩存會(huì)給所有調(diào)用者返回緩存對(duì)象的相同實(shí)例。因此這些對(duì)象不能被修改。這提供了很重要的性能優(yōu)勢(shì)。可讀寫的緩存會(huì)返回緩存對(duì)象的拷貝(通過序列化)。這會(huì)慢一些,但是安全,因此默認(rèn)是false。

如果已經(jīng)開啟二級(jí)緩存的mapper里面某個(gè)查詢不需要緩存,可以使用useCache=”false”禁用二級(jí)緩存:

<select id="selectByPrimaryKey" resultMap="BaseResultMap" parameterType="java.lang.String" useCache="false">

?

刷新緩存:?

在mapper的同一個(gè)namespace中,如果有其他insert、update、delete操作后都需要執(zhí)行刷新緩存操作,來避免臟讀。?

這時(shí)我們只需要設(shè)置statement配置中的flushCache=“true“屬性,就會(huì)默認(rèn)刷新緩存,相反如果是false就不會(huì)了。?
當(dāng)然,不管開不開緩存刷新功能,你要是手動(dòng)更改數(shù)據(jù)庫表,那都肯定不能避免臟讀的發(fā)生,那就屬于手賤了。

??????無論是一級(jí)緩存還是二級(jí)緩存,C/U/D增刪改操作commit提交后會(huì)清空緩存區(qū)域,使緩存失效。合理利用二級(jí)緩存可以提高系統(tǒng)性能,減少數(shù)據(jù)庫壓力。但是,如果使用不當(dāng)可那個(gè)會(huì)出現(xiàn)緩存一致性問題,對(duì)查詢結(jié)果實(shí)時(shí)性要求不高,此時(shí)可采用mybatis二級(jí)緩存技術(shù)降低數(shù)據(jù)庫訪問量,提高訪問速度。

?



mybatis在一個(gè)事物中獲取oracle中的sequence,一開始沒有問題,每次都返回不同的值,運(yùn)行幾天之后,批量處理三條數(shù)據(jù),返回的是同一個(gè)sequence;

mybatis ?xml文件中的sql如下:

?

以下四種解決方法,本人用的第二種:

1.拿出@Transactional,就不會(huì)出錯(cuò)。

2.加上useCache="false" flushCache="true",不保存在二級(jí)緩存中,并清空緩存

3.mybatis.configuration.localCacheScope=STATEMENT,修改一級(jí)緩存的作用域

4.mybatis.configuration.cacheEnabled = false,禁用一級(jí)和二級(jí)緩存



?

?

mybatis在一個(gè)事物中獲取oracle中的sequence,一開始沒有問題,每次都返回不同的值,運(yùn)行幾天之后,批量處理三條數(shù)據(jù),返回的是同一個(gè)sequence;

超強(qiáng)干貨來襲 云風(fēng)專訪:近40年碼齡,通宵達(dá)旦的技術(shù)人生

總結(jié)

以上是生活随笔為你收集整理的mybatis 缓存总结以及遇到的问题的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。