cachemodel是ibatis裡面內建的緩衝機制,正確的應用能很好提升我們系統的效能。
使用方法:在sqlmap的設定檔中加入
<cacheModel type="LRU" id="article_cache" readOnly="true" serialize="false">
<flushInterval hours="24"/>
<flushOnExecute statement="articleLists.insertArticle"/>
<property name="cache_size" value="50"/>
</cacheModel>
在查詢語句中使用緩衝
<select id="getArticles" resultClass="articleList" parameterClass="articleList" cacheModel="article_cache">
先對cachemodel中一些用法進行解釋一下:
type:是緩衝的類型,ibatis中有4種方式,分別為MEMORY、LRU、FIFO、OSCACHE
MEMORY是記憶體緩衝,和Java記憶體管理機制類似分為[SOFT、WEAK、STRONG]
LRU是使用最近最少使用原則
FIFO是使用先進先出策略
OSCACHE是通過第三方的快取區外掛程式實現
id:是cachemodel的一個標識
readOnly:指緩衝的資料對象是唯讀還是可讀寫,預設唯讀,這裡的唯讀並不是意味著資料對象一旦放入緩衝中就無法再對資料進行修改。而是當資料對象發生變化的時候,如資料對象的某個屬性發生了變化,則此資料對象就將被從緩衝中廢除,下次需要重新從資料庫讀取資料,構造新的資料對象。而readOnly="false"則意味著緩衝中的資料對象可更新.
serialize:只有在readOnly為false的情況下才生效,因為在readOnly為true時,所有資料對象相同,只有可讀寫時,才會出現不同的session擁有不同的資料對象副本。
flushInterval:指定緩衝自動重新整理的時間,可以為hours,minutes,seconds,milliseconds.
flushOnExecute:指定在發生哪些操作時,更新緩衝。
property:不同type的cachemodel有不同的屬性。
----------------------------------------------------------------------------
下面是本人自己做的實驗的一些結果:
(1)當readOnly=true ,serialize=false,只指定insert更新緩衝時,我在update一個article的屬性後,發現之前的相同的查詢條件查詢結果是緩衝的內容,沒取到更新的結果;當我改變查詢條件時,出現了更新的結果。由此可見當readonly=true,查詢條件不變時,即使發生更新,緩衝仍然有效;而查詢條件變更時,緩衝失效,用新的sql去資料庫查詢。當發生insert操作時,不管查詢條件是否變化,都重新去資料庫查詢,緩衝被更新。
(2)當readOnly=false,serialize=false,只指定insert更新緩衝時,update一個article屬性後,緩衝失效,重新去資料庫查詢
綜上來看,對更新比較頻繁的資料,使不使用感覺效率差不多,對更新不是很頻繁的資料,使用緩衝效率還是能提升的!