ibatis 高速缓存
一、緩存介紹
1.1、引入
???? 什么影響Internet訪問速率?
???? 訪問網(wǎng)站的過程是通過建立在TCP/IP協(xié)議之上的HTTP協(xié)議來完成的。從客戶端發(fā)出一個HTTP請求開始,用戶所經(jīng)歷的等待時間主要決定于DNS和網(wǎng)站的響應(yīng)時間。網(wǎng)站域名首先必須被DNS服務(wù)器解析為IP地址,HTTP的延時則由在客戶端和服務(wù)器間的若干個往返時間所決定。
? 往返時間是指客戶端等待每次請求的響應(yīng)時間,平均往返時間取決于三個方面:網(wǎng)站服務(wù)器的延時; 由路由器、網(wǎng)關(guān)、代理服務(wù)器和防火墻引入的延時;不同通信鏈路上的數(shù)據(jù)傳輸速率.
1.2、緩存對象
???? 理論上,Web分層設(shè)計的各個層都可以有緩存,Web中的任何對象都可以緩存。
1.2.1、Http請求結(jié)果的緩存
???? 瀏覽器緩存、代理緩存、服務(wù)器端方向代理緩存、使用Filter實現(xiàn)對請求結(jié)果頁面的緩存
1.2.2、Java對象的緩存
???? 緩存數(shù)據(jù)庫查詢結(jié)果對象
1.3、緩存介質(zhì)[保存在哪里]
???? 從硬件介質(zhì)上來將無非就是兩種,內(nèi)存和硬盤.但是往往我們不會從硬件上來劃分,一般的劃分方法是從技術(shù)上劃分,可以分成幾種,內(nèi)存,硬盤文件.數(shù)據(jù)庫.
1.4、緩存的類型
???? 網(wǎng)絡(luò)緩存可以在客戶端,也可以在網(wǎng)絡(luò)上,由此我們將緩存分為兩類:瀏覽器緩存和代理緩存。
1.4.1、瀏覽器緩存
???? 幾乎目前所有的瀏覽器都有一個內(nèi)置的緩存,它們通常利用客戶端本地的內(nèi)存和硬盤來完成緩存工作,同時允許用戶對緩存的內(nèi)容大小作控制。
1.4.2、代理緩存
???? 代理緩存是一種獨立的應(yīng)用層網(wǎng)絡(luò)服務(wù),它更像E-mail、Web、DNS等服務(wù)。許多用戶不僅可以共享緩存,而且可以同時訪問緩存中的內(nèi)容。其工作原理:當(dāng)代理緩存收到客戶端的請求時,它首先檢查所請求的內(nèi)容是否已經(jīng)被緩存。如果沒有找到,緩存必須以客戶端的名義轉(zhuǎn)發(fā)請求,并在收到服務(wù)器發(fā)出的文件時,將它以一定的形式保存在本地硬盤,并將其發(fā)送給客戶端。
1.5、緩存更新策略
1.5.1 FIFO[first in first out]
???? 最先進(jìn)入緩存得數(shù)據(jù)在緩存空間不夠情況下(超出最大元素限制時)會被首先清理出去
1.5.2 LFU[Less Frequently Used]
???? 一直以來最少被使用的元素會被被清理掉。這就要求緩存的元素有一個hit 屬性,在緩存空間不夠得情況下,hit 值最小的將會被清出緩存。
1.5.3 LRU[Least Recently Used]
???? 最近最少使用的,緩存的元素有一個時間戳,當(dāng)緩存容量滿了,而又需要騰出地方來緩存新的元素的時候,那么現(xiàn)有緩存元素中時間戳離當(dāng)前時間最遠(yuǎn)的元素將被清出緩存。
二.iBATIS高速緩存介紹
2.1 iBATIS高速緩存的關(guān)注點
???? iBATIS高速緩存只關(guān)注如何在持久層對查詢結(jié)果進(jìn)行緩存。
2.2 iBATIS對高速緩存管理的幫助
???? iBATIS帶來的好處就是通過配置文件來管理高速緩存,幫助避免因手工管理高速緩存結(jié)果及其依賴性而造成的大量繁瑣的工作。
2.3 iBATIS高速緩存和傳統(tǒng)O/RM高速緩存的區(qū)別
???? iBATIS的思想是建立SQL語句到對象的映射,而不是建立數(shù)據(jù)庫表到對象的映射。傳統(tǒng)O/RM工具主要關(guān)注數(shù)據(jù)庫表到對象的映射。傳統(tǒng)的O/RM高速緩存會為其管理的每個對象維護(hù)一個OID[object identification,對象標(biāo)識],就像數(shù)據(jù)庫需要管理其表中的每條記錄的唯一性一樣。這意味著,如果兩個不同的結(jié)果都返回同一個對象,那么該對象將只被高速緩存一次。iBATIS不這樣,關(guān)注的是SQL語句的執(zhí)行結(jié)果,我們不會根據(jù)對象的唯一性來高速緩存它們iBATIS高速緩存的所有結(jié)果,而不考慮所標(biāo)識的對象是否存在于高速緩存中。
三.配置iBATIS緩存
3.1 、cacheModel標(biāo)簽
???? cacheModel標(biāo)簽用來配置iBATIS的高速緩存,cacheModel標(biāo)簽的屬性包括四個屬性
?? ?? id[必需]
???? 該值用來指定一個唯一的ID,便于為需要使用此高速緩存模型所配置的高速緩存的查詢已映射語句使用。
?? ? type[必需]
???? 此屬性用于指定高速緩存所配置的高速緩存的類型。其有效值包括MEMORY LRU FIFO OSCACHE,該屬性也可取值為某個自定義CacheController實現(xiàn)的全限定名。
???? readOnly[可選]
???? 取值為true時表示高速緩存將僅僅用作只讀緩存,從只讀高速緩存中讀出的對象的特性值不允許修改。
???? serialize[可選]
???? 該屬性用于指定在讀取高度緩存內(nèi)容時是否要進(jìn)行“深復(fù)制”
???? readOnly、serialize屬性經(jīng)常聯(lián)合起來使用。
3.2 、iBATIS高速緩存模型的類型
3.2.1 MEMORY
???? MEMORY高速緩存是一種基于引用的高速緩存。MEMORY高速緩存模型對于那些更關(guān)注內(nèi)存的管理策略而不是對象的訪問策略的應(yīng)用程序而言是完美的。有了STRONG、SOFT、WEAK這三種引用類型,就可以確定哪些結(jié)果應(yīng)該比其他結(jié)果保留更長的時間。
3.2.2 LRU
???? LRU類型的高速緩存模型使用最近最少使用策略來管理高速緩存。該高速緩存的內(nèi)部機制會在后臺記錄哪些對象最近最少使用,一旦超過高速緩存大小限制就會廢棄它們。大小限制規(guī)定了高速緩存中可以存放的對象數(shù)目。應(yīng)避免將那些占用較大內(nèi)存的對象放置在此類高速緩存中,否則內(nèi)存會很快耗盡。
???? LRU高速緩存非常設(shè)用于那些需要根據(jù)某些特定對象的訪問頻率來管理的高速緩存的情況。通常這種高速緩存策略試用于那些需要高速緩存用于分頁結(jié)果或關(guān)鍵詞搜索結(jié)果的對象應(yīng)用程序中。
3.2.3 FIFO
???? FIFO高速緩存模型采用先進(jìn)先出的管理策略,是一種基于時間的策略,使用于放置那些初放入時使用頻率高、隨時間流逝訪問頻率就會降低的對象。如:報表、報告股票價格。
3.2.4 OSCACHE
???? OSCache是個一個廣泛采用的高性能的J2EE緩存框架,OSCache能用于任何Java應(yīng)用程序的普通的緩存解決方案。OSCache有以下特點:
??? ? 緩存任何對象,你可以不受限制的緩存部分jsp頁面或HTTP請求,任何java對象都可以緩存。
擁有全面的API--OSCache API給你全面的程序來控制所有的OSCache特性。
永久緩存--緩存能隨意的寫入硬盤,因此允許昂貴的創(chuàng)建(expensive-to-create)數(shù)據(jù)來保持緩存,甚至能讓應(yīng)用重啟。
支持集群--集群緩存數(shù)據(jù)能被單個的進(jìn)行參數(shù)配置,不需要修改代碼。
緩存記錄的過期--你可以有最大限度的控制緩存對象的過期,包括可插入式的刷新策略(如果默認(rèn)性能不需要時)
3.2.5自定義高速緩存模型
???? 只需要實現(xiàn)com.ibatis.sqlmap.engine.cache.CacheController接口即可,配置時設(shè)定type為全限類名或其別名即可。
3.3 高速緩存的清除
??? 使用flushOnExecute、flushInterval標(biāo)簽可以定義清空緩存觸發(fā)條件
?? <flushOnExecute>??? 定義查詢已映射語句,其執(zhí)行將引起相關(guān)高速緩存的清除
?? <flushInterval>??? 定義一個時間間隔,高速緩存將以此間隔定期清除
?? <flushInterval>標(biāo)簽屬性如下:
?? hours(可選)??? 每次清除高速緩存前應(yīng)該經(jīng)過的小時數(shù)
?? minutes(可選)??? 每次清除高速緩存前應(yīng)該經(jīng)過的分鐘數(shù)
?? seconds(可選)??? 每次清除高速緩存前應(yīng)該經(jīng)過的秒數(shù)
?? milliseconds(可選)??? 每次清除高速緩存前應(yīng)該經(jīng)過的毫秒數(shù)?
3.4 設(shè)置高速緩存模式實現(xiàn)的特性
由于高速緩存模型只是一些可以插入到iBATIS框架的組件,它甚至允許用戶自己定制,因此必須有一種方式能為這些組件提供任意的值。<property>標(biāo)簽就是用來完成此任務(wù)的。name :所設(shè)定的特性的名稱,value:所設(shè)定的特性的值。
3.5 常見問題
3.5.1如何選擇iBATIS高速緩存模型類型
???? 如何選擇一個適合實際應(yīng)用情況的高速緩存模型類型是一個很負(fù)責(zé)的問題,需要考慮諸多因素。
需要考慮的因素:
??? 1.當(dāng)前應(yīng)用程序是否是數(shù)據(jù)庫的唯一操作入口
??? 2.讀寫屬性
??? 3.緩存時間間隔
??? 4.失效控制
??? 5.最大保存對象數(shù)目
?
轉(zhuǎn)載于:https://blog.51cto.com/392155455/1073816
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅持創(chuàng)作打卡瓜分現(xiàn)金大獎總結(jié)
以上是生活随笔為你收集整理的ibatis 高速缓存的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 职场‘下班沉默症’调查
- 下一篇: 将网页保存为webarchive文件的代