www.久久久久|狼友网站av天堂|精品国产无码a片|一级av色欲av|91在线播放视频|亚洲无码主播在线|国产精品草久在线|明星AV网站在线|污污内射久久一区|婷婷综合视频网站

當(dāng)前位置:首頁 > 電源 > 功率器件
[導(dǎo)讀]本文主要是關(guān)于二級緩存的介紹,并著重描述了二級緩存的簡單配置全過程,希望通過本文能讓你對二級緩存有更深的了解。二級緩存CPU緩存(Cache Memory)位于CPU與內(nèi)存之間的臨

本文主要是關(guān)于二級緩存的介紹,并著重描述了二級緩存的簡單配置全過程,希望通過本文能讓你對二級緩存有更深的了解。

二級緩存

CPU緩存(Cache Memory)位于CPU與內(nèi)存之間的臨時存儲器,它的容量比內(nèi)存小但交換速度快。在緩存中的數(shù)據(jù)是內(nèi)存中的一小部分,但這一小部分是短時間內(nèi)CPU即將訪問的,當(dāng)CPU調(diào)用大量數(shù)據(jù)時,就可避開內(nèi)存直接從緩存中調(diào)用,從而加快讀取速度。最初緩存只有一級,二級緩存(L2 CACHE)出現(xiàn)是為了協(xié)調(diào)一級緩存與內(nèi)存之間的速度。二級緩存比一級緩存速度更慢,容量更大,主要就是做一級緩存和內(nèi)存之間數(shù)據(jù)臨時交換的地方用。實際上,現(xiàn)在Intel和AMD處理器在一級緩存的邏輯結(jié)構(gòu)設(shè)計上有所不同,所以二級緩存對CPU性能的影響也不盡相同。

緩存是指可以進(jìn)行高速數(shù)據(jù)交換的存儲器,它先于內(nèi)存與CPU交換數(shù)據(jù),因此速度很快。L1Cache(一級緩存)是CPU第一層高速緩存。內(nèi)置的L1高速緩存的容量和結(jié)構(gòu)對CPU的性能影響較大,不過高速緩沖存儲器均由靜態(tài)RAM組成,結(jié)構(gòu)較復(fù)雜,在CPU管芯面積不能太大的情況下,L1級高速緩存的容量不可能做得太大。一般L1緩存的容量通常在32—256KB。L2Cache(二級緩存)是CPU的第二層高速緩存,分內(nèi)部和外部兩種芯片。內(nèi)部的芯片二級緩存運行速度與主頻相同,而外部的二級緩存則只有主頻的一半。L2高速緩存容量也會影響CPU的性能,原則是越大越好,現(xiàn)在普通臺式機(jī)CPU的L2緩存一般為128KB到2MB或者更高,筆記本、服務(wù)器和工作站上用CPU的L2高速緩存最高可達(dá)1MB-3MB。

二級緩存的簡單配置教程詳解

本教程以MyBatis二級緩存設(shè)置為例。

一、創(chuàng)建Cache的完整過程

我們從SqlSessionFactoryBuilder解析mybaTIs-config.xml配置文件開始:

Reader reader = Resources.getResourceAsReader(“mybaTIs-config.xml”);

SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);

然后是:

XMLConfigBuilder parser = new XMLConfigBuilder(inputStream, environment, properTIes);

return build(parser.parse());

看parser.parse()方法:

parseConfiguraTIon(parser.evalNode(“/configuration”));

看處理Mapper.xml文件的位置:

mapperElement(root.evalNode(“mappers”));

看處理Mapper.xml的XMLMapperBuilder:

XMLMapperBuilder mapperParser = new XMLMapperBuilder(inputStream, configuration,

resource, configuration.getSqlFragments());

mapperParser.parse();

繼續(xù)看parse方法:

configurationElement(parser.evalNode(“/mapper”));

到這里:

String namespace = context.getStringAttribute(“namespace”);

if (namespace.equals(“”)) {

throw new BuilderException(“Mapper‘s namespace cannot be empty”);

}

builderAssistant.setCurrentNamespace(namespace);

cacheRefElement(context.evalNode(“cache-ref”));

cacheElement(context.evalNode(“cache”));

從這里看到namespace就是xml中《mapper》元素的屬性。然后下面是先后處理的cache-ref和cache,后面的cache會覆蓋前面的cache-ref,但是如果一開始cache-ref沒有找到引用的cache,他就不會被覆蓋,會一直到最后處理完成為止,最后如果存在cache,反而會被cache-ref覆蓋。這里是不是看著有點暈、有點亂?所以千萬別同時配置這兩個,實際上也很少有人會這么做。

看看MyBatis如何處理《cache/》:

private void cacheElement(XNode context) throws Exception {

if (context != null) {

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);

}

}

從源碼可以看到MyBatis讀取了那些屬性,而且很容易可以到這些屬性的默認(rèn)值。

創(chuàng)建Java的cache對象方法為builderAssistant.useNewCache,我們看看這段代碼:

public Cache useNewCache(Class《? extends Cache》 typeClass,

Class《? extends Cache》 evictionClass,

Long flushInterval,

Integer size,

boolean readWrite,

boolean blocking,

Properties props) {

typeClass = valueOrDefault(typeClass, PerpetualCache.class);

evictionClass = valueOrDefault(evictionClass, LruCache.class);

Cache cache = new CacheBuilder(currentNamespace)

.implementation(typeClass)

.addDecorator(evictionClass)

.clearInterval(flushInterval)

.size(size)

.readWrite(readWrite)

.blocking(blocking)

.properties(props)

.build();

configuration.addCache(cache);

currentCache = cache;

return cache;

}

從調(diào)用該方法的地方,我們可以看到并沒有使用返回值cache,在后面的過程中創(chuàng)建MappedStatement的時候使用了currentCache。

二、使用Cache過程

在系統(tǒng)中,使用Cache的地方在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();

獲取cache后,先判斷是否有二級緩存。

只有通過《cache/》,《cache-ref/》或@CacheNamespace,@CacheNamespaceRef標(biāo)記使用緩存的Mapper.xml或Mapper接口(同一個namespace,不能同時使用)才會有二級緩存。

if (cache != null) {

如果cache存在,那么會根據(jù)sql配置(《insert》,《select》,《update》,《delete》的flushCache屬性來確定是否清空緩存。

flushCacheIfRequired(ms);

然后根據(jù)xml配置的屬性useCache來判斷是否使用緩存(resultHandler一般使用的默認(rèn)值,很少會null)。

if (ms.isUseCache() && resultHandler == null) {

確保方法沒有Out類型的參數(shù),mybatis不支持存儲過程的緩存,所以如果是存儲過程,這里就會報錯。

ensureNoOutParams(ms, parameterObject, boundSql);

沒有問題后,就會從cache中根據(jù)key來取值:

@SuppressWarnings(“unchecked”)

List《E》 list = (List《E》) tcm.getObject(cache, key);

如果沒有緩存,就會執(zhí)行查詢,并且將查詢結(jié)果放到緩存中。

if (list == null) {

list = delegate.《E》query(ms, parameterObject,

rowBounds, resultHandler, key, boundSql);

tcm.putObject(cache, key, list); // issue #578 and #116

}

返回結(jié)果

return list;

}

}

沒有緩存時,直接執(zhí)行查詢

return delegate.《E》query(ms, parameterObject, rowBounds, resultHandler, key, boundSql);

}

在上面的代碼中tcm.putObject(cache, key, list);這句代碼是緩存了結(jié)果。但是實際上直到sqlsession關(guān)閉,MyBatis才以序列化的形式保存到了一個Map(默認(rèn)的緩存配置)中。

三、Cache使用時的注意事項

1. 只能在【只有單表操作】的表上使用緩存

不只是要保證這個表在整個系統(tǒng)中只有單表操作,而且和該表有關(guān)的全部操作必須全部在一個namespace下。

2. 在可以保證查詢遠(yuǎn)遠(yuǎn)大于insert,update,delete操作的情況下使用緩存

這一點不需要多說,所有人都應(yīng)該清楚。記住,這一點需要保證在1的前提下才可以!

四、避免使用二級緩存

可能會有很多人不理解這里,二級緩存帶來的好處遠(yuǎn)遠(yuǎn)比不上他所隱藏的危害。

緩存是以namespace為單位的,不同namespace下的操作互不影響。

insert,update,delete操作會清空所在namespace下的全部緩存。

通常使用MyBatis Generator生成的代碼中,都是各個表獨立的,每個表都有自己的namespace。

為什么避免使用二級緩存

在符合【Cache使用時的注意事項】的要求時,并沒有什么危害。

其他情況就會有很多危害了。

針對一個表的某些操作不在他獨立的namespace下進(jìn)行。

例如在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)險。

有關(guān)這樣單表的操作可能不常見。但是你也許想到了一種常見的情況。

多表操作一定不能使用緩存

為什么不能?

首先不管多表操作寫到那個namespace下,都會存在某個表不在這個namespace下的情況。

例如兩個表:role和user_role,如果我想查詢出某個用戶的全部角色role,就一定會涉及到多表的操作。

《select id=“selectUserRoles” resultType=“UserRoleVO”》

select * from user_role a,role b where a.roleid = b.roleid and a.userid = #{userid}

《/select》

像上面這個查詢,你會寫到那個xml中呢??

不管是寫到RoleMapper.xml還是UserRoleMapper.xml,或者是一個獨立的XxxMapper.xml中。如果使用了二級緩存,都會導(dǎo)致上面這個查詢結(jié)果可能不正確。

如果你正好修改了這個用戶的角色,上面這個查詢使用緩存的時候結(jié)果就是錯的。

這點應(yīng)該很容易理解。

在我看來,就以MyBatis目前的緩存方式來看是無解的。多表操作根本不能緩存。

如果你讓他們都使用同一個namespace(通過《cache-ref》)來避免臟數(shù)據(jù),那就失去了緩存的意義。

看到這里,實際上就是說,二級緩存不能用。整篇文章介紹這么多也沒什么用了。

五、挽救二級緩存?

想更高效率的使用二級緩存是解決不了了。

但是解決多表操作避免臟數(shù)據(jù)還是有法解決的。解決思路就是通過攔截器判斷執(zhí)行的sql涉及到那些表(可以用jsqlparser解析),然后把相關(guān)表的緩存自動清空。但是這種方式對緩存的使用效率是很低的。

設(shè)計這樣一個插件是相當(dāng)復(fù)雜的,既然我沒想著去實現(xiàn),就不廢話了。

結(jié)語

關(guān)于二級緩存的介紹就到這了,希望本文能讓你對二級緩存有更深的理解,如有不足之處歡迎指正。

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內(nèi)容真實性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時聯(lián)系本站刪除。
換一批
延伸閱讀

9月2日消息,不造車的華為或?qū)⒋呱龈蟮莫毥谦F公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關(guān)鍵字: 阿維塔 塞力斯 華為

加利福尼亞州圣克拉拉縣2024年8月30日 /美通社/ -- 數(shù)字化轉(zhuǎn)型技術(shù)解決方案公司Trianz今天宣布,該公司與Amazon Web Services (AWS)簽訂了...

關(guān)鍵字: AWS AN BSP 數(shù)字化

倫敦2024年8月29日 /美通社/ -- 英國汽車技術(shù)公司SODA.Auto推出其旗艦產(chǎn)品SODA V,這是全球首款涵蓋汽車工程師從創(chuàng)意到認(rèn)證的所有需求的工具,可用于創(chuàng)建軟件定義汽車。 SODA V工具的開發(fā)耗時1.5...

關(guān)鍵字: 汽車 人工智能 智能驅(qū)動 BSP

北京2024年8月28日 /美通社/ -- 越來越多用戶希望企業(yè)業(yè)務(wù)能7×24不間斷運行,同時企業(yè)卻面臨越來越多業(yè)務(wù)中斷的風(fēng)險,如企業(yè)系統(tǒng)復(fù)雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務(wù)連續(xù)性,提升韌性,成...

關(guān)鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據(jù)媒體報道,騰訊和網(wǎng)易近期正在縮減他們對日本游戲市場的投資。

關(guān)鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會開幕式在貴陽舉行,華為董事、質(zhì)量流程IT總裁陶景文發(fā)表了演講。

關(guān)鍵字: 華為 12nm EDA 半導(dǎo)體

8月28日消息,在2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會上,華為常務(wù)董事、華為云CEO張平安發(fā)表演講稱,數(shù)字世界的話語權(quán)最終是由生態(tài)的繁榮決定的。

關(guān)鍵字: 華為 12nm 手機(jī) 衛(wèi)星通信

要點: 有效應(yīng)對環(huán)境變化,經(jīng)營業(yè)績穩(wěn)中有升 落實提質(zhì)增效舉措,毛利潤率延續(xù)升勢 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務(wù)引領(lǐng)增長 以科技創(chuàng)新為引領(lǐng),提升企業(yè)核心競爭力 堅持高質(zhì)量發(fā)展策略,塑強(qiáng)核心競爭優(yōu)勢...

關(guān)鍵字: 通信 BSP 電信運營商 數(shù)字經(jīng)濟(jì)

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺與中國電影電視技術(shù)學(xué)會聯(lián)合牽頭組建的NVI技術(shù)創(chuàng)新聯(lián)盟在BIRTV2024超高清全產(chǎn)業(yè)鏈發(fā)展研討會上宣布正式成立。 活動現(xiàn)場 NVI技術(shù)創(chuàng)新聯(lián)...

關(guān)鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會上,軟通動力信息技術(shù)(集團(tuán))股份有限公司(以下簡稱"軟通動力")與長三角投資(上海)有限...

關(guān)鍵字: BSP 信息技術(shù)
關(guān)閉
關(guān)閉