相關(guān)資訊
- 《戰(zhàn)國(guó)無(wú)雙4-2》怎么換服裝?戰(zhàn)國(guó)無(wú)
- 關(guān)于責(zé)任的名言警句大全
- 《戰(zhàn)國(guó)無(wú)雙4-2》PC版如何聯(lián)機(jī)? 戰(zhàn)
- 戰(zhàn)國(guó)無(wú)雙4-2技能覺(jué)醒牛逼嗎 全新
- 《戰(zhàn)國(guó)無(wú)雙4-2》手柄無(wú)效怎么解決
- 戰(zhàn)國(guó)無(wú)雙4-2如何設(shè)置語(yǔ)言 戰(zhàn)國(guó)無(wú)雙
- 戰(zhàn)國(guó)無(wú)雙4-2怎么樣跳過(guò)進(jìn)入開(kāi)場(chǎng)動(dòng)畫(huà)
- 什么是應(yīng)屆生畢業(yè)生
- 應(yīng)屆生簡(jiǎn)歷自我評(píng)價(jià)
- 應(yīng)屆生簡(jiǎn)歷怎么寫(xiě)
本類常用軟件
-
福建農(nóng)村信用社手機(jī)銀行客戶端下載下載量:584204
-
Windows優(yōu)化大師下載量:416898
-
90美女秀(視頻聊天軟件)下載量:366961
-
廣西農(nóng)村信用社手機(jī)銀行客戶端下載下載量:365699
-
快播手機(jī)版下載量:325855
久聞mybatis/ibatis大名今天終于爆發(fā)了,找了一堆mybatis的討論。。。這部分大多是關(guān)乎sql寫(xiě)在xml之類的
看了下mybatis的高速緩存的討論。。。這部分無(wú)不例外的在分享緩存的配置。。。包括緩存實(shí)現(xiàn)。。。緩存過(guò)期策略。。。
LRU。。。FIFO。。。
如果說(shuō)在xml里面寫(xiě)sql。。并且在上一堆dtd描述。。并且聲稱這樣便于dba維護(hù)sql。?梢灾苯影褜(xiě)好的sql copy到xml里面去。?梢越y(tǒng)一管理。 好吧,這些都屬于個(gè)人習(xí)慣,無(wú)所謂。
只不過(guò)我在想把這些sql變成方法,例如最簡(jiǎn)單的一個(gè):
- <select id=”getUserList” resultMap="UserResult" cacheModel=”user-cache”>
- select * from USER
- </select>
- 變成:
- public UserResult getUserList(){
- return baseDao.find("select * from USER");
- }
我了解的太少,還沒(méi)能看出這樣有什么分別。關(guān)于這個(gè),我只是有點(diǎn)點(diǎn)疑惑。(當(dāng)然,你可以把這些寫(xiě)在一個(gè)類里面,便于你們的DBA維護(hù))
。。。。。。。。。
作為一個(gè)ORM框架,除了面向?qū)ο蟛樵?如JPA之類的,還有一個(gè)不得不提的東西:緩存。
在我為緩存頭痛的時(shí)候,我努力的尋找mybatis緩存的做法。畢竟這么多人使用的框架一定可以學(xué)習(xí)一下緩存的實(shí)現(xiàn)。
在我輸入關(guān)鍵詞:ibatis 緩存/mybatis 緩存 看過(guò)基本上找到并且有時(shí)間去看的文章之后,我心里產(chǎn)生了一個(gè)疑問(wèn):為什么這些人來(lái)來(lái)去去都是講的LRU、FIFO這些東西,或者貼出了這么一段精妙絕倫的代碼:
- public List query(MappedStatement ms, Object parameterObject, RowBounds rowBounds, ResultHandler resultHandler) throws SQLException {
- if (ms != null) {
- Cache cache = ms.getCache();
- if (cache != null) {
- flushCacheIfRequired(ms);
- cache.getReadWriteLock().readLock().lock();
- try {
- if (ms.isUseCache() && resultHandler == null) {
- CacheKey key = createCacheKey(ms, parameterObject, rowBounds);
- final List cachedList = (List) cache.getObject(key);
- if (cachedList != null) {
- return cachedList;
- } else {
- List list = delegate.query(ms, parameterObject, rowBounds, resultHandler);
- tcm.putObject(cache, key, list);
- return list;
- }
- } else {
- return delegate.query(ms, parameterObject, rowBounds, resultHandler);
- }
- } finally {
- cache.getReadWriteLock().readLock().unlock();
- }
- }
- }
- return delegate.query(ms, parameterObject, rowBounds, resultHandler);
- }
當(dāng)然,還有不少人畫(huà)了一些UML例圖來(lái)給苦難大眾講解 CachingExecutor是如何工作的。
我不懂UML,也不知道怎么為這些精妙的if else畫(huà)用例圖。我開(kāi)始走向絕望:“為什么這群人來(lái)來(lái)去去僅僅關(guān)心這些東西?”
于是乎我下載了mybatis的源碼,還好其結(jié)構(gòu)很清晰。我在想“mybatis是如何讓緩存過(guò)期?”畢竟這個(gè)是緩存的關(guān)鍵所在,于是我找到了這個(gè):
- public int update(MappedStatement ms, Object parameterObject) throws SQLException {
- flushCacheIfRequired(ms);
- return delegate.update(ms, parameterObject);
- }
然后我又看到了這個(gè):
- private void flushCacheIfRequired(MappedStatement ms) {
- Cache cache = ms.getCache();
- if (cache != null) {
- if (ms.isFlushCacheRequired()) {
- tcm.clear(cache);
- }
- }
- }
我很震驚,就這么樣的。整個(gè)Cache被clear了。很簡(jiǎn)潔。哦不,是根本不帶任何煩雜的處理,干脆利落的干掉了緩存的老巢。
MappedStatement到底是何方神圣,雖然不知道也沒(méi)看也看不明白(和傳聞中的一樣,不帶一絲注釋),但是據(jù)我猜測(cè)加上看到的一些mybatis的配置。
我想mybatis把一個(gè)xml/namespace的sqlMap 裝進(jìn)了一個(gè)Cache,然后。。。沒(méi)有然后了。
這不禁的讓我想到了看到的動(dòng)畫(huà)片里面感到疑惑不解的是為什么一個(gè)小飛船biu的一下巨大的戰(zhàn)艦就爆了。
。。。。。。。。。。。。。。
對(duì)于這種緩存,我想到了這么一個(gè)場(chǎng)景。a用戶查詢得到查詢緩存,b用戶update自己的東西。a用戶的查詢緩存又掛了,重新查詢得到查詢緩存。
當(dāng)然,mybatis的緩存是大家的,不分你我他。
。。。。。。。。
如果,你真的有那么一些更新不頻繁的接口。我建議使用spring的緩存,有clear方法。針對(duì)整個(gè)方法/事物。
- 第 1 樓 美國(guó)CZ88.NET 網(wǎng)友 客人 發(fā)表于: 2014/10/24 15:20:18
- 听到你说biu的一声,我震惊了