mybatis的緩存筆記

mybatis 的緩存

mybatis 自身帶有兩級緩存,並且還有接口可以於其他緩存框架合併

一級緩存

解釋:

  • (本地緩存):SqlSession級別的緩存,一級緩存是一直開啓的
  • 與數據庫同一次會話期間查詢到的數據會放在本地緩存中
  • 以後如果需要獲取相同的數據,直接從緩存中拿,沒必要再去查詢數據庫

一級緩存失效情況 : 最後還是要向數據庫發出查詢

  1. SQLSession 不同
  2. SQLSession 相同,查詢條件不同(當前一級緩存沒有這個數據)
  3. SQLSession 相同,兩次查詢之間執行了增刪改操作。(這次增刪改可能會改變查找的數據)
  4. SQLSession 相同,手動清除了一級緩存(緩存清空)

二級緩存

解釋 :

  • (全局緩存)
  • 基於namespace級別的緩存:一個namespace對應一個二級緩存

工作機制

  • 一個會話: 查詢一條數據,這個數據就會被放在當前會話的一級緩存那種;
  • 如果會話關閉,一級緩存中的數據就會被保存到二級緩存中,新的會話查詢信息,就可以參照二級緩存
    	Sqlsession === EmployeeMapper ==> Employee
    		 DepartmentMapper ===> Department
    
  • 不同的namespace查出的數據就會放在自己對應的namespace中(map)
  • 效果
    1. 數據會從二級緩存中獲取
    2. 查出的數據都會被默認先放在一級緩存中
    3. 只用會話提交或者關閉以後,一級緩存中的數據纔會轉移到二級緩存中去

使用

  1. 開啓全局二級緩存配置 ;
  2. 去mapper.xml 中配置使用二級緩存
     <cache eviction="FIFO" 
     flushInterval="60000" 
     readOnly="false" 
     size="1024" ></cache>
      <!--
    eviction:緩存的回收策略:
        • LRU – 最近最少使用的:移除最長時間不被使用的對象。
        • FIFO – 先進先出:按對象進入緩存的順序來移除它們。
        • SOFT – 軟引用:移除基於垃圾回收器狀態和軟引用規則的對象。
        • WEAK – 弱引用:更積極地移除基於垃圾收集器狀態和弱引用規則的對象。
        • 默認的是 LRU。
    flushInterval:緩存刷新間隔
        緩存多長時間清空一次,默認不清空,設置一個毫秒值
    readOnly:是否只讀:
        true:只讀;mybatis認爲所有從緩存中獲取數據的操作都是隻讀操作,不會修改數據。
                 mybatis爲了加快獲取速度,直接就會將數據在緩存中的引用交給用戶。不安全,速度快
        false:非只讀:mybatis覺得獲取的數據可能會被修改。
                mybatis會利用序列化&反序列的技術克隆一份新的數據給你。安全,速度慢
    size:緩存存放多少元素;
    type="":指定自定義緩存的全類名;
            實現Cache接口即可;
    -->
    

有關的設置/屬性

  1. mybatis的配置文件setting ————> cacheEnabled=true:false:關閉緩存(二級緩存關閉)(一級緩存一直可用的)
  2. 每個select標籤都有useCache=“true”;(false:不使用緩存(一級緩存依然使用,二級緩存不使用)
  3. 每個增刪改標籤的:flushCache=“true”:(一級二級都會清除)
  4. sqlSession.clearCache();只是清楚當前session的一級緩存;
  5. localCacheScope:本地緩存作用域:(一級緩存SESSION);當前會話的所有數據保存在會話緩存中;( STATEMENT:可以禁用一級緩存;)(在配置文件setting設置)

第三方緩存整合(ehcache)

  1. 導入第三方緩存包即可;
  2. 導入與第三方緩存整合的適配包;官方有;
  3. mapper.xml中使用自定義緩存:(< cache type=“org.mybatis.caches.ehcache.EhcacheCache”>)

ehcache 的xml文件的屬性解釋

<?xml version="1.0" encoding="UTF-8"?>
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">

 <!-- 磁盤保存路徑 -->
 <diskStore path="D:\ehcache" />

 <defaultCache
         maxElementsInMemory="10000"
         maxElementsOnDisk="10000000"
         eternal="false"
         overflowToDisk="true"
         timeToIdleSeconds="120"
         timeToLiveSeconds="120"
         diskExpiryThreadIntervalSeconds="120"
         memoryStoreEvictionPolicy="LRU">
 </defaultCache>
</ehcache>
<!-- 
屬性說明:
 diskStore:指定數據在磁盤中的存儲位置。
 defaultCache:當藉助CacheManager.add("demoCache")創建Cache時,EhCache便會採用<defalutCache/>指定的的管理策略
 
以下屬性是必須的:
 maxElementsInMemory - 在內存中緩存的element的最大數目 
 maxElementsOnDisk - 在磁盤上緩存的element的最大數目,若是0表示無窮大
 eternal - 設定緩存的elements是否永遠不過期。如果爲true,則緩存的數據始終有效,如果爲false那麼還要根據timeToIdleSeconds,timeToLiveSeconds判斷
 overflowToDisk - 設定當內存緩存溢出的時候是否將過期的element緩存到磁盤上
 
以下屬性是可選的:
 timeToIdleSeconds - 當緩存在EhCache中的數據前後兩次訪問的時間超過timeToIdleSeconds的屬性取值時,這些數據便會刪除,默認值是0,也就是可閒置時間無窮大
 timeToLiveSeconds - 緩存element的有效生命期,默認是0.,也就是element存活時間無窮大
 diskSpoolBufferSizeMB 這個參數設置DiskStore(磁盤緩存)的緩存區大小.默認是30MB.每個Cache都應該有自己的一個緩衝區.
 diskPersistent - 在VM重啓的時候是否啓用磁盤保存EhCache中的數據,默認是false。
 diskExpiryThreadIntervalSeconds - 磁盤緩存的清理線程運行間隔,默認是120秒。每個120s,相應的線程會進行一次EhCache中數據的清理工作
 memoryStoreEvictionPolicy - 當內存緩存達到最大,有新的element加入的時候, 移除緩存中element的策略。默認是LRU(最近最少使用),可選的有LFU(最不常使用)和FIFO(先進先出)
 -->
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章