Ibatis的resultMap的cacheModel研究

1. cacheModel屬性說明

id: cacheModel的id.

type: cache的類型. ibatis目前提供了LRU,MEMORY,FIFO,OSCACHE這四種.

  •       FIFO: com.ibatis.sqlmap.engine.cache.fifo.FifoCacheController
  •       LRU:  com.ibatis.sqlmap.engine.cache.fifo.LruCacheController
  •       MEMORY: com.ibatis.sqlmap.engine.cache.fifo.MemoryCacheController
  •       OSCACHE: com.ibatis.sqlmap.engine.cache.fifo.OSCacheController



      當然,你也可以自己來實現Cache, 你需要做的是讓你的Cache類 implements com.ibatis.sqlmap.engine.cache.CacheController.

readOnly: 是否只讀. 默認爲true, 只讀.

serialize: 是否從Cache中讀取同一個對象,還是對象的副本.
           只有在readOnly=false纔有效.
   因爲Cache是隻讀的,那麼爲不同session返回的對象肯定是一個.
   只有在Cache是可讀寫的時候,才需要爲每個session返回對象的副本.

flushInterval: Cache刷新間隔. 可以配置hours,minutes,seconds,milliseconds.
           注: 不是說,間隔時間到了,在Cache的statement會自己刷新,而是說,在間隔時間過了後,下次的查詢
   將不會從Cache中直接去值,而會用SQL去查.也就是: 如果,間隔時間過了,還沒有Cache對應的statement執行
   的話,那麼Cache中就會一直是舊的,不用擔心Cache數據是舊的,因爲下次的查詢將會直接從SQL查詢,而非Cache,查詢的結果也會去更新Cache的值.

flushOnExecute: 當這些statement被執行了,那麼下次的查詢將會通過SQL去查,同時用查詢結果更新Cache.
           注: 和flushInterval的刷新一樣,不是主動刷新,而是由下次查詢來觸發被動刷新.
               在一個cacheModel中可以指定多個flushOnExecute.

property: 這是針對cacheModel的額外的一些屬性配置.不同type的cacheModel將會有自己專有的一些property配置.
          FIFO: <property name="size" value="100" />
          LRU: <property name="cache-size" value="100" />
  MEMORY: <property name="reference-type" value="WEAK" />
  OSCACHE: 該屬性不可用, 而是依賴在ClassPath下的一個oscache.properties文件



2. 具體例子

注: cache的key是具體執行的SQL語句.

舉例來說明: 如上面的<select id="CodeModel-SelectCodeModel".

第一次值爲1的查詢: 通過SQL查詢, 緩存的key就會是SELECT...AND C.CODE_ID = 1, 緩存的value就是查詢結果.
再執行值爲1的查詢: 結果就會直接從cache中取. [當然前提必須是:flushInterval還沒到,同時flushOnExecute對應的statement還沒有被執行過]

如果再執行一次值爲2的查詢: 那麼由於key爲 SELECT...AND C.CODE_ID = 2, 在cache不存在, 就會直接執行SQL, 並將結果緩存起來.

也就是cache完全是以具體執行的SQL語句作爲key來存儲的.

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