關於Mybatis緩存你真的知道嗎?

Mybatis緩存

1)一級緩存:(本地緩存):
* sqlSession級別的緩存。一級緩存是一直開啓的;SqlSession級別的一個Map
* 與數據庫同一次會話期間查詢到的數據會放在本地緩存中。
* 以後如果需要獲取相同的數據,直接從緩存中拿,沒必要再去查詢數據庫;
*
* 一級緩存失效情況(沒有使用到當前一級緩存的情況,效果就是,還需要再向數據庫發出查詢):
* 1、sqlSession不同。
* 2、sqlSession相同,查詢條件不同.(當前一級緩存中還沒有這個數據)
* 3、sqlSession相同,兩次查詢之間執行了增刪改操作(這次增刪改可能對當前數據有影響)
* 4、sqlSession相同,手動清除了一級緩存(緩存清空)

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

  • 工作機制:

    • 1、一個會話,查詢一條數據,這個數據就會被放在當前會話的一級緩存中;

    • 2、如果會話關閉;一級緩存中的數據會被保存到二級緩存中;新的會話查詢信息,就可以參照二級緩存中的內容;

    • 3、sqlSession=EmployeeMapper>Employee
      不同namespace查出的數據會放在自己對應的緩存中(map)
      效果: 數據會從二級緩存中獲取,查出的數據都會被默認先放在一級緩存中。只有會話提交或者關閉以後,一級緩存中的數據纔會轉移到二級緩存中
      使用:

      1)、開啓全局二級緩存配置:
      
    <settings>
    		<!--顯式的指定每個我們需要更改的配置的值,即使他是默認的。防止版本更新帶來的問題  -->
    		<setting name="cacheEnabled" value="true"/>
    </settings>
    
    	2)、去mapper.xml中配置使用二級緩存:
    
    <mapper namespace="com.atguigu.mybatis.dao.EmployeeMapper">
        
    	<cache type="org.mybatis.caches.ehcache.EhcacheCache"></cache>
    	<!-- <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接口即可;
    	-->
        
     </mapper>
    
    	3)、我們的POJO需要實現序列化接口
    
    @Alias("emp")
    public class Employee implements Serializable{
        
    }
    
 * 	以下作爲了解:
     * 和緩存有關的設置/屬性:
     * 			1)、cacheEnabled=truefalse:關閉緩存(二級緩存關閉)(一級緩存一直可用的)
     * 			2)、每個select標籤都有useCache="true"* 					false:不使用緩存(一級緩存依然使用,二級緩存不使用)
     * 			==3)、【每個增刪改標籤的:flushCache="true":(一級二級都會清除)】==
     * 					增刪改執行完成後就會清楚緩存;
     * 					測試:flushCache="true":一級緩存就清空了;二級也會被清除;
     * 					查詢標籤:flushCache="false"* 						如果flushCache=true;每次查詢之後都會清空緩存;緩存是沒有被使用的;
     * 			4)、sqlSession.clearCache();只是清楚當前session的一級緩存;
     * 			5)、localCacheScope:本地緩存作用域:(一級緩存SESSION);當前會話的所有數據保存在會話緩存中;
     * 								STATEMENT:可以禁用一級緩存;		

3)第三方緩存整合
a)、導入第三方緩存包即可;
b)、導入與第三方緩存整合的適配包;官方有;
c)、mapper.xml中使用自定義緩存

 	<cache type="org.mybatis.caches.ehcache.EhcacheCache"></cache>

ehcache.xml配置文件設置

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