ibatis緩存

一、緩存介紹
1.1、引入
     什麼影響Internet訪問速率?
     訪問網站的過程是通過建立在TCP/IP協議之上的HTTP協議來完成的。從客戶端發出一個HTTP請求開始,用戶所經歷的等待時間主要決定於DNS和網站的響應時間。網站域名首先必須被DNS服務器解析爲IP地址,HTTP的延時則由在客戶端和服務器間的若干個往返時間所決定。 
   往返時間是指客戶端等待每次請求的響應時間,平均往返時間取決於三個方面:網站服務器的延時; 由路由器、網關、代理服務器和防火牆引入的延時;不同通信鏈路上的數據傳輸速率.

1.2、緩存對象
     理論上,Web分層設計的各個層都可以有緩存,Web中的任何對象都可以緩存。
1.2.1、Http請求結果的緩存
     瀏覽器緩存、代理緩存、服務器端方向代理緩存、使用Filter實現對請求結果頁面的緩存
1.2.2、Java對象的緩存
     緩存數據庫查詢結果對象

1.3、緩存介質[保存在哪裏]
     從硬件介質上來將無非就是兩種,內存和硬盤.但是往往我們不會從硬件上來劃分,一般的劃分方法是從技術上劃分,可以分成幾種,內存,硬盤文件.數據庫. 

1.4、緩存的類型
     網絡緩存可以在客戶端,也可以在網絡上,由此我們將緩存分爲兩類:瀏覽器緩存和代理緩存。
1.4.1、瀏覽器緩存

     幾乎目前所有的瀏覽器都有一個內置的緩存,它們通常利用客戶端本地的內存和硬盤來完成緩存工作,同時允許用戶對緩存的內容大小作控制。
1.4.2、代理緩存

     代理緩存是一種獨立的應用層網絡服務,它更像E-mail、Web、DNS等服務。許多用戶不僅可以共享緩存,而且可以同時訪問緩存中的內容。其工作原理:當代理緩存收到客戶端的請求時,它首先檢查所請求的內容是否已經被緩存。如果沒有找到,緩存必須以客戶端的名義轉發請求,並在收到服務器發出的文件時,將它以一定的形式保存在本地硬盤,並將其發送給客戶端。 

1.5、緩存更新策略
1.5.1 FIFO[first in first out] 
     最先進入緩存得數據在緩存空間不夠情況下(超出最大元素限制時)會被首先清理出去 
1.5.2 LFU[Less Frequently Used]
     一直以來最少被使用的元素會被被清理掉。這就要求緩存的元素有一個hit 屬性,在緩存空間不夠得情況下,hit 值最小的將會被清出緩存。 
1.5.3 LRU[Least Recently Used]
     最近最少使用的,緩存的元素有一個時間戳,當緩存容量滿了,而又需要騰出地方來緩存新的元素的時候,那麼現有緩存元素中時間戳離當前時間最遠的元素將被清出緩存。

二.iBATIS高速緩存介紹
2.1 iBATIS高速緩存的關注點
     iBATIS高速緩存只關注如何在持久層對查詢結果進行緩存。

2.2 iBATIS對高速緩存管理的幫助
     iBATIS帶來的好處就是通過配置文件來管理高速緩存,幫助避免因手工管理高速緩存結果及其依賴性而造成的大量繁瑣的工作。

2.3 iBATIS高速緩存和傳統O/RM高速緩存的區別
     iBATIS的思想是建立SQL語句到對象的映射,而不是建立數據庫表到對象的映射。傳統O/RM工具主要關注數據庫表到對象的映射。傳統的O/RM高速緩存會爲其管理的每個對象維護一個OID[object identification,對象標識],就像數據庫需要管理其表中的每條記錄的唯一性一樣。這意味着,如果兩個不同的結果都返回同一個對象,那麼該對象將只被高速緩存一次。iBATIS不這樣,關注的是SQL語句的執行結果,我們不會根據對象的唯一性來高速緩存它們iBATIS高速緩存的所有結果,而不考慮所標識的對象是否存在於高速緩存中。

三.配置iBATIS緩存
3.1 、cacheModel標籤
     cacheModel標籤用來配置iBATIS的高速緩存,cacheModel標籤的屬性包括四個屬性
      id[必需]
     該值用來指定一個唯一的ID,便於爲需要使用此高速緩存模型所配置的高速緩存的查詢已映射語句使用。
     type[必需]
     此屬性用於指定高速緩存所配置的高速緩存的類型。其有效值包括MEMORY LRU FIFO OSCACHE,該屬性也可取值爲某個自定義CacheController實現的全限定名。
     readOnly[可選]
     取值爲true時表示高速緩存將僅僅用作只讀緩存,從只讀高速緩存中讀出的對象的特性值不允許修改。
     serialize[可選]
     該屬性用於指定在讀取高度緩存內容時是否要進行“深複製”
     readOnly、serialize屬性經常聯合起來使用。

3.2 、iBATIS高速緩存模型的類型
3.2.1 MEMORY
     MEMORY高速緩存是一種基於引用的高速緩存。MEMORY高速緩存模型對於那些更關注內存的管理策略而不是對象的訪問策略的應用程序而言是完美的。有了STRONG、SOFT、WEAK這三種引用類型,就可以確定哪些結果應該比其他結果保留更長的時間。
3.2.2 LRU
     LRU類型的高速緩存模型使用最近最少使用策略來管理高速緩存。該高速緩存的內部機制會在後臺記錄哪些對象最近最少使用,一旦超過高速緩存大小限制就會廢棄它們。大小限制規定了高速緩存中可以存放的對象數目。應避免將那些佔用較大內存的對象放置在此類高速緩存中,否則內存會很快耗盡。
     LRU高速緩存非常設用於那些需要根據某些特定對象的訪問頻率來管理的高速緩存的情況。通常這種高速緩存策略試用於那些需要高速緩存用於分頁結果或關鍵詞搜索結果的對象應用程序中。
3.2.3 FIFO
     FIFO高速緩存模型採用先進先出的管理策略,是一種基於時間的策略,使用於放置那些初放入時使用頻率高、隨時間流逝訪問頻率就會降低的對象。如:報表、報告股票價格。
3.2.4 OSCACHE
     OSCache是個一個廣泛採用的高性能的J2EE緩存框架,OSCache能用於任何Java應用程序的普通的緩存解決方案。OSCache有以下特點:
      緩存任何對象,你可以不受限制的緩存部分jsp頁面或HTTP請求,任何java對象都可以緩存。
  擁有全面的API--OSCache API給你全面的程序來控制所有的OSCache特性。
  永久緩存--緩存能隨意的寫入硬盤,因此允許昂貴的創建(expensive-to-create)數據來保持緩存,甚至能讓應用重啓。
  支持集羣--集羣緩存數據能被單個的進行參數配置,不需要修改代碼。
  緩存記錄的過期--你可以有最大限度的控制緩存對象的過期,包括可插入式的刷新策略(如果默認性能不需要時)
3.2.5自定義高速緩存模型
     只需要實現com.ibatis.sqlmap.engine.cache.CacheController接口即可,配置時設定type爲全限類名或其別名即可。

3.3 高速緩存的清除
    使用flushOnExecute、flushInterval標籤可以定義清空緩存觸發條件
   <flushOnExecute>    定義查詢已映射語句,其執行將引起相關高速緩存的清除
   <flushInterval>    定義一個時間間隔,高速緩存將以此間隔定期清除
   <flushInterval>標籤屬性如下:
   hours(可選)    每次清除高速緩存前應該經過的小時數
   minutes(可選)    每次清除高速緩存前應該經過的分鐘數
   seconds(可選)    每次清除高速緩存前應該經過的秒數
   milliseconds(可選)    每次清除高速緩存前應該經過的毫秒數  

3.4 設置高速緩存模式實現的特性
由於高速緩存模型只是一些可以插入到iBATIS框架的組件,它甚至允許用戶自己定製,因此必須有一種方式能爲這些組件提供任意的值。<property>標籤就是用來完成此任務的。name :所設定的特性的名稱,value:所設定的特性的值。

3.5 常見問題
3.5.1如何選擇iBATIS高速緩存模型類型
     如何選擇一個適合實際應用情況的高速緩存模型類型是一個很負責的問題,需要考慮諸多因素。
需要考慮的因素:
    1.當前應用程序是否是數據庫的唯一操作入口
    2.讀寫屬性
    3.緩存時間間隔
    4.失效控制
    5.最大保存對象數目

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章