成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久

您的位置:首頁技術(shù)文章
文章詳情頁

詳解Mybatis的緩存

瀏覽:5日期:2023-10-20 12:33:49
Mybatis的緩存

mybatis是一個(gè)查詢數(shù)據(jù)庫的封裝框架,主要是封裝提供靈活的增刪改sql,開發(fā)中,service層能夠通過mybatis組件查詢和修改數(shù)據(jù)庫中表的數(shù)據(jù);作為查詢工具,mybatis有使用緩存,這里講一下mybatis的緩存相關(guān)源碼。

緩存

在計(jì)算機(jī)里面,任何信息都有源頭,緩存一般指源頭信息讀取后,放在內(nèi)存或者其他讀取較快的地方,下次讀取相同信息不去源頭查詢而是直接從內(nèi)存(或者能快速存取的硬件)讀取。這樣可以減少硬件使用,提高讀取速度。

mybatis也是這樣,查詢數(shù)據(jù)庫的數(shù)據(jù)之后,mybatis可以把查詢結(jié)果緩存到內(nèi)存,下次查詢?nèi)绻樵冋Z句相同,并且查詢相關(guān)的表的數(shù)據(jù)沒被修改過,就可以直接返回緩存中的結(jié)果,而不用去查詢數(shù)據(jù)庫的語句,有效節(jié)省了時(shí)間。

簡(jiǎn)單看一下mybatis一級(jí)緩存和二級(jí)緩存相關(guān)源碼,學(xué)習(xí)使用

一級(jí)緩存

通過查看源碼可知,一級(jí)緩存是綁定sqSsession中的,所以每次查詢sqlSession不同就失效,相同的sqlSession可以使用一級(jí)緩存。

mybatis默認(rèn)sqlsession:org.apache.ibatis.session.defaults.DefaultSqlSession

構(gòu)造方法中傳入executor(查詢執(zhí)行對(duì)象)

public DefaultSqlSession(Configuration configuration, Executor executor, boolean autoCommit) { this.configuration = configuration; this.executor = executor; this.dirty = false; this.autoCommit = autoCommit; }

executor中攜帶一級(jí)緩存成員:

protected BaseExecutor(Configuration configuration, Transaction transaction) { this.transaction = transaction; this.deferredLoads = new ConcurrentLinkedQueue<>(); this.localCache = new PerpetualCache('LocalCache'); //默認(rèn)一級(jí)緩存 this.localOutputParameterCache = new PerpetualCache('LocalOutputParameterCache'); this.closed = false; this.configuration = configuration; this.wrapper = this; }查詢使用一級(jí)緩存邏輯

org.apache.ibatis.executor.BaseExecutor.query()

public <E> List<E> query(MappedStatement ms, Object parameter, RowBounds rowBounds, ResultHandler resultHandler, CacheKey key, BoundSql boundSql) throws SQLException { ErrorContext.instance().resource(ms.getResource()).activity('executing a query').object(ms.getId()); List<E> list; try { queryStack++; //localCache 一級(jí)緩存 list = resultHandler == null ? (List<E>) localCache.getObject(key) : null; //先從一級(jí)緩存中獲取,key是通過sql語句生成 if (list != null) { handleLocallyCachedOutputParameters(ms, key, parameter, boundSql); } else { // 如果緩存中沒有 才從數(shù)據(jù)庫查詢 list = queryFromDatabase(ms, parameter, rowBounds, resultHandler, key, boundSql); } } finally { queryStack--; } return list; } //從數(shù)據(jù)庫讀取數(shù)據(jù) private <E> List<E> queryFromDatabase(MappedStatement ms, Object parameter, RowBounds rowBounds, ResultHandler resultHandler, CacheKey key, BoundSql boundSql) throws SQLException { List<E> list; localCache.putObject(key, EXECUTION_PLACEHOLDER); try { list = doQuery(ms, parameter, rowBounds, resultHandler, boundSql); } finally { localCache.removeObject(key);//將一級(jí)緩存清除 } localCache.putObject(key, list);//返回查詢結(jié)果之前,先放入一級(jí)緩存 刷新 if (ms.getStatementType() == StatementType.CALLABLE) { localOutputParameterCache.putObject(key, parameter); } return list; }二級(jí)緩存

二級(jí)緩存mapper中的,默認(rèn)是開啟的,但需要在映射文件mapper.xml中添加<cache/>標(biāo)簽

<mapper namespace='userMapper'><cache/><!-- 添加cache標(biāo)簽表示此mapper使用二級(jí)緩存 --></mapper>

配置false可以關(guān)閉二級(jí)緩存

二級(jí)緩存的解析

org.apache.ibatis.builder.xml.XMLMapperBuilder

private void configurationElement(XNode context) { try { //... cacheElement(context.evalNode('cache')); //解析cache標(biāo)簽 } catch (Exception e) { throw new BuilderException('Error parsing Mapper XML. The XML location is ’' + resource + '’. Cause: ' + e, e); } } private void cacheElement(XNode context) { if (context != null) { // if hava cache tag 如果有cache標(biāo)簽才執(zhí)行下面的邏輯 String type = context.getStringAttribute('type', 'PERPETUAL'); Class<? extends Cache> typeClass = typeAliasRegistry.resolveAlias(type); String eviction = context.getStringAttribute('eviction', 'LRU'); Class<? extends Cache> evictionClass = typeAliasRegistry.resolveAlias(eviction); Long flushInterval = context.getLongAttribute('flushInterval'); Integer size = context.getIntAttribute('size'); boolean readWrite = !context.getBooleanAttribute('readOnly', false); boolean blocking = context.getBooleanAttribute('blocking', false); Properties props = context.getChildrenAsProperties(); builderAssistant.useNewCache(typeClass, evictionClass, flushInterval, size, readWrite, blocking, props);//建立二級(jí)緩存 } }

org.apache.ibatis.builder.MapperBuilderAssistant.useNewCache():

public Cache useNewCache(Class<? extends Cache> typeClass, Class<? extends Cache> evictionClass, Long flushInterval, Integer size, boolean readWrite, boolean blocking, Properties props) { Cache cache = new CacheBuilder(currentNamespace) .implementation(valueOrDefault(typeClass, PerpetualCache.class)) .addDecorator(valueOrDefault(evictionClass, LruCache.class)) .clearInterval(flushInterval) .size(size) .readWrite(readWrite) .blocking(blocking) .properties(props) .build(); configuration.addCache(cache);//二級(jí)緩存賦值,如果cache標(biāo)簽為空,不會(huì)執(zhí)行此方法,currentCache為空 currentCache = cache; return cache; }

在映射文件mapper中如果沒有cache標(biāo)簽,不會(huì)執(zhí)行上面的useNewCache方法,cache為null,就不會(huì)使用二級(jí)緩存(相當(dāng)于失效)。

查詢使用二級(jí)緩存邏輯

org.apache.ibatis.executor.CachingExecutor :

@Override public <E> List<E> query(MappedStatement ms, Object parameterObject, RowBounds rowBounds, ResultHandler resultHandler, CacheKey key, BoundSql boundSql) throws SQLException { Cache cache = ms.getCache(); if (cache != null) {//如果二級(jí)緩存對(duì)象不為空 嘗試在二級(jí)緩存中獲取(沒有cache標(biāo)簽此對(duì)象就是空) flushCacheIfRequired(ms); if (ms.isUseCache() && resultHandler == null) { ensureNoOutParams(ms, boundSql); @SuppressWarnings('unchecked') List<E> list = (List<E>) tcm.getObject(cache, key); //從二級(jí)緩存中獲取數(shù)據(jù) if (list == null) { list = delegate.query(ms, parameterObject, rowBounds, resultHandler, key, boundSql); //如果為空,使用delegate查詢(BaseExecutor) tcm.putObject(cache, key, list); // 查詢結(jié)果保存到二級(jí)緩存 } return list; } } return delegate.query(ms, parameterObject, rowBounds, resultHandler, key, boundSql); }

二級(jí)緩存和一級(jí)緩存不用想,數(shù)據(jù)庫的數(shù)據(jù)被修改是要清空緩存的,不然數(shù)據(jù)有誤,至于怎么清空,是另一套邏輯了,mapper中的cache標(biāo)簽可以配置一些參數(shù),比如緩存定期清空。

一級(jí)二級(jí)緩存先后順序

mybatis默認(rèn)是先查詢二級(jí)緩存,沒有,再查看一級(jí)緩存,都為空,最后查詢數(shù)據(jù)庫

以上就是詳解Mybatis的緩存的詳細(xì)內(nèi)容,更多關(guān)于Mybatis的緩存的資料請(qǐng)關(guān)注好吧啦網(wǎng)其它相關(guān)文章!

標(biāo)簽: Mybatis 數(shù)據(jù)庫
相關(guān)文章:
成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久
欧美日韩高清一区二区不卡| 中文字幕第一区第二区| 亚洲精品一区二区三区在线观看| 亚洲国产精品一区二区www| 国产精品观看| 久久婷婷国产综合精品青草| 国产麻豆精品一区二区| 欧美亚洲国产一卡| 日韩中文欧美在线| 亚洲精品美女| 亚洲欧美日韩小说| 在线观看日韩av电影| 亚洲国产精品成人综合色在线婷婷| 成人免费视频app| 91精品国产欧美一区二区18| 久久99精品国产.久久久久| 91黄色免费看| 日本不卡123| 美女成人午夜| 亚洲国产乱码最新视频| 一区二区三区偷拍| 亚洲视频综合在线| 在线精品亚洲一区二区| 亚洲免费在线观看| 99爱精品视频| 亚洲精品视频在线| 日韩午夜视频在线观看| 亚洲精品中文在线| 99在线精品免费视频九九视| 亚洲伦在线观看| 国产一级久久| 亚洲成人一区二区| 狼狼综合久久久久综合网| 亚洲成人你懂的| 久久亚洲图片| 美女被吸乳得到大胸91| 欧美人成免费网站| 丁香六月久久综合狠狠色| 精品奇米国产一区二区三区| 91猫先生在线| 中文字幕中文字幕在线一区| 亚洲性图久久| 亚洲精品高清在线观看| 久久国产精品高清| 蜜臀av国产精品久久久久| 欧美剧情片在线观看| 国产ts人妖一区二区| 欧美大白屁股肥臀xxxxxx| 懂色av噜噜一区二区三区av | 欧美成人女星排名| 欧美777四色影| 国产精品福利av| 免费看的黄色欧美网站| 久久99精品国产91久久来源| 精品久久免费看| 欧美午夜在线视频| 亚洲最大成人综合| 久久精品国产99精品国产亚洲性色| 日韩精品视频网| 欧美日韩极品在线观看一区| 成人久久视频在线观看| 久久精品亚洲国产奇米99| 一区视频在线| 五月婷婷久久综合| 欧美精品xxxxbbbb| 91猫先生在线| 亚洲国产欧美一区二区三区丁香婷| 欧美专区在线观看一区| 成人网在线免费视频| 欧美国产精品v| 中文精品在线| 激情小说欧美图片| 久久精品视频一区二区| 国产精品毛片| 国产一区三区三区| 久久久综合激的五月天| 亚洲看片网站| 美女视频黄频大全不卡视频在线播放| 日韩视频一区二区在线观看| 亚洲午夜久久久久久尤物| 蜜臀av一区二区在线观看| 日韩欧美中文字幕精品| 欧美日本在线| 亚洲与欧洲av电影| 欧美一区在线视频| 国产精品国产亚洲精品看不卡15 | 91精品一区二区三区在线观看| 99国产精品99久久久久久| 亚洲精品亚洲人成人网| 欧美日韩一区三区| 色综合久久综合中文综合网| 亚洲精品国产精品乱码不99| 欧美精品 日韩| 欧美日韩综合| 美国精品在线观看| 欧美激情一区二区三区不卡| 久久最新视频| 91视频免费看| 日本不卡一区二区| 国产日韩在线不卡| 色激情天天射综合网| 91麻豆高清视频| 香蕉成人伊视频在线观看| 日韩精品一区二区三区中文精品| 在线精品在线| 国内精品伊人久久久久av一坑| 中文无字幕一区二区三区| 色老汉一区二区三区| 欧美日本高清| 国产在线播放一区| 亚洲日本在线视频观看| 91精品国产一区二区三区蜜臀| 欧美日韩一区二区三区在线视频| 美女一区二区久久| 1区2区3区国产精品| 欧美一区二区黄色| 久久精品一区二区三区中文字幕| 色综合中文综合网| 精品视频一区二区不卡| 一区二区三区我不卡| 国产电影一区二区三区| 一区二区三区欧美视频| 久久综合久久久久88| 欧洲色大大久久| 日韩视频不卡| 99久久综合国产精品| 日本欧美久久久久免费播放网| 国产精品毛片久久久久久| 欧美一区二区三区在线观看视频 | 精品日韩在线一区| 色丁香久综合在线久综合在线观看| 91在线视频18| 国产一区二三区好的| 午夜视频在线观看一区| 国产精品私人影院| 51精品视频一区二区三区| 国产伦精品一区二区三| 欧美日韩精品伦理作品在线免费观看| 国产在线日韩欧美| 日日摸夜夜添夜夜添国产精品| 中文在线免费一区三区高中清不卡| 日韩视频在线观看一区二区| 欧美在线一二三| 羞羞视频在线观看欧美| 黄色成人91| 91丝袜美女网| 国产大陆精品国产| 久久国产麻豆精品| 亚洲18影院在线观看| 中文字幕一区二区三区蜜月 | 青青草国产成人av片免费| 亚洲精品老司机| 国产欧美日韩三级| 亚洲精品在线三区| 日韩天堂在线观看| 欧美日韩国产美| 色天使色偷偷av一区二区| 亚洲国产第一| 国自产拍偷拍福利精品免费一| 成人福利电影精品一区二区在线观看| 国内精品免费在线观看| 精品一区二区免费| 美女一区二区三区| 日本不卡高清视频| 日韩成人一区二区三区在线观看| 亚洲丝袜制服诱惑| 中文字幕第一区综合| 国产亚洲欧美色| 久久久久成人黄色影片| 精品女同一区二区| 精品国产百合女同互慰| 日韩欧美你懂的| 69av一区二区三区| 日韩一区二区三区视频在线 | 日韩成人av影视| 日韩成人精品视频| 日韩国产欧美三级| 五月激情六月综合| 日韩av二区在线播放| 免费看精品久久片| 精品一区二区三区视频| 国产真实乱子伦精品视频| 国产精品影视在线| 国产福利91精品一区二区三区| 福利电影一区二区| 91亚洲资源网| 欧美久久综合| 国产精品a久久久久| 亚洲视频高清| 亚洲黄色三级| 国产亚洲一区在线播放| 性娇小13――14欧美| 久热re这里精品视频在线6| 欧美在线三级电影| 7777精品伊人久久久大香线蕉完整版| 欧美精品在线观看一区二区| 91精品国产综合久久精品app| 7777精品伊人久久久大香线蕉经典版下载 | 欧美大片在线观看一区二区| 久久免费视频色|