筆記:MyBatis Mapper XML文件詳解 - Cache

  • 緩存(Cache)

    從數據庫中加載的數據緩存到內存中,是不少應用程序爲了提升性能而採起的一向作法。MyBatis對經過映射的SELECT語句加載的查詢結果提供了內建的緩存支持。默認狀況下,啓用一級緩存;即,若是你使用同一個SqlSession接口對象調用了相同的SELECT語句,則直接會從緩存中返回結果,而不是再查詢一次數據庫,但Session Close 或者 Flush 後,緩存將被清除。MyBatis的二級緩存就是全局緩存,能夠被全部SqlSession共享,MyBatis 包含一個很是強大的查詢緩存特性,它能夠很是方便地配置和定製。默認狀況下是沒有開啓緩存的,要開啓二級緩存,你須要在你的 SQL 映射文件中添加一行: 算法

    <cache /> 數據庫

    而且要開啓全局的 Settings 中啓用全局緩存: 緩存

    <setting name="cacheEnabled" value="true" /> 安全

    緩存默認值以下: mybatis

    • 映射語句文件中的全部 select 語句將會被緩存。
    • 映射語句文件中的全部 insert,update 和 delete 語句會刷新緩存。
    • 緩存會使用 Least Recently Used(LRU,最近最少使用的)算法來收回。
    • 根據時間表(好比 no Flush Interval,沒有刷新間隔), 緩存不會以任什麼時候間順序來刷新。
    • 緩存會存儲列表集合或對象(不管查詢方法返回什麼)的 1024 個引用。
    • 緩存會被視爲是 read/write(可讀/可寫)的緩存,意味着對象檢索不是共享的,而 且能夠安全地被調用者修改,而不干擾其餘調用者或線程所作的潛在修改。

    全部的這些屬性均可以經過緩存元素的屬性來修改。好比: app

            <cache 框架

             eviction="FIFO" dom

             flushInterval="60000" 性能

             size="512" spa

             readOnly="true"/>

    這個更高級的配置建立了一個 FIFO 緩存,並每隔 60 秒刷新,存數結果對象或列表的 512 個引用,並且返回的對象被認爲是隻讀的,所以在不一樣線程中的調用者之間修改它們會 致使衝突。

    可用的收回策略有:

    • LRU – 最近最少使用的:移除最長時間不被使用的對象。 (默認)
    • FIFO – 先進先出:按對象進入緩存的順序來移除它們。
    • SOFT – 軟引用:移除基於垃圾回收器狀態和軟引用規則的對象。
    • WEAK – 弱引用:更積極地移除基於垃圾收集器狀態和弱引用規則的對象。
  • flushInterval(刷新間隔):能夠被設置爲任意的正整數,並且它們表明一個合理的毫秒 形式的時間段。默認狀況是不設置,也就是沒有刷新間隔,緩存僅僅調用語句時刷新。
  • size(引用數目):能夠被設置爲任意正整數,要記住你緩存的對象數目和你運行環境的可用內存資源數目。默認值是 1024。
  • readOnly(只讀):屬性能夠被設置爲 true 或 false。只讀的緩存會給全部調用者返回緩 存對象的相同實例。所以這些對象不能被修改。這提供了很重要的性能優點。可讀寫的緩存 會返回緩存對象的拷貝(經過序列化) 。這會慢一些,可是安全,所以默認是 false。

    注意:須要緩存的對象必需要繼承 Serializable 接口,須要支持序列化

  • 自定義緩存

    使用自定義緩存

    除了這些自定義緩存的方式, 你也能夠經過實現你本身的緩存或爲其餘第三方緩存方案 建立適配器來徹底覆蓋緩存行爲。

    <cache type="com.domain.something.MyCustomCache"/>

    這個示例展現瞭如何使用一個自定義的緩存實現。type 屬性指定的類必須實現 org.mybatis.cache.Cache 接口。這個接口是 MyBatis 框架中不少複雜的接口之一,可是簡單 給定它作什麼就行。

        public interface Cache {

         String getId();

         int getSize();

         void putObject(Object key, Object value);

         Object getObject(Object key);

         boolean hasKey(Object key);

         Object removeObject(Object key);

         void clear();

        }

  • 參照緩存

    這個特殊命名空間的惟一緩存會被使用或者刷新相同命名空間內的語句。也許未來的某個時候,你會想在命名空間中共享相同的緩存配置和實例。在這樣的狀況下你能夠使用 cache-ref 元素來引用另一個緩存。

    <cache-ref namespace="com.someone.application.data.SomeMapper"/>

相關文章
相關標籤/搜索