Hibernate筆記------快取

2020-10-02 01:00:14

二級快取

  1. Hiberante二級快取
    Hibernate的快取:
    一級快取:session級快取
    二級快取:sessionFactory級快取,用處很大(執行緒級:ehcache)
    三級快取:分散式快取(程序級:redis)

  2. 快取分類

    1. 實體快取:根據實體的ID進行快取,快取的是一個一個的物件
    2. 查詢快取:根據HQL查詢語句進行快取,快取的是結果集。setCacheable(true)
      快取:是很多個map(key, value)組成,使用region來區別
  3. ehcache使用

    1.引入ehcache的相關jar包

     ehcache-2.10.3.jar
     hibernate-ehcache-5.3.8.Final.jar
     slf4j-api-1.7.7.jar
    
    1. 編寫ehcache.xml組態檔
    <?xml version="1.0" encoding="UTF-8"?>
       <ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     	xsi:noNamespaceSchemaLocation="http://ehcache.org/ehcache.xsd">
    
     <diskStore path="../ehcache/hibernate"/>
     <defaultCache maxElementsInMemory="10000" eternal="false" timeToIdleSeconds="600" timeToLiveSeconds="3600"
     	overflowToDisk="true" diskSpoolBufferSizeMB="30" maxElementsOnDisk="10000000" 
     	diskPersistent="false" diskExpiryThreadIntervalSeconds="600"/>
     
     <!-- hibernate內建的快取區域 -->
     <cache name="org.hibernate.cache.internal.StandardQueryCache" maxElementsInMemory="50" eternal="false" timeToIdleSeconds="3600" timeToLiveSeconds="7200" overflowToDisk="true"/>
     <cache name="org.hibernate.cache.internal.UpdateTimestampsCache" maxElementsInMemory="5000" eternal="true"  overflowToDisk="true"/>
    
     <!-- 實體物件客製化快取,沒客製化的實體使用預設設定 -->
     <cache name="***.Student" maxElementsInMemory="1000" eternal="false" timeToIdleSeconds="600" timeToLiveSeconds="7200" overflowToDisk="true"/>
     <cache name="***.Clazz" maxElementsInMemory="1000" eternal="false" timeToIdleSeconds="600" timeToLiveSeconds="7200" overflowToDisk="true"/>
     <cache name="***.Clazz.students" maxElementsInMemory="1000" eternal="false" timeToIdleSeconds="600" timeToLiveSeconds="7200" overflowToDisk="true"/>
     <!-- 手動使用快取 -->
     <cache name="mycache" maxElementsInMemory="1000" eternal="false" timeToIdleSeconds="600" timeToLiveSeconds="7200" overflowToDisk="true"/>	
    </ehcache>
    
    1. 在hibernate.cfg.xml中開啟二級快取,指定EhCache
    <property name="cache.use_second_level_cache">true</property>
     	<property name="cache.use_query_cache">true</property>
     	<property name="cache.region.factory_class">org.hibernate.cache.ehcache.internal.EhcacheRegionFactory</property>
    
    1. 在實體類上標註@Cache註解
    @Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
    
  4. Hibernate的快取會自動同步更新

    • 快取什麼時候失效

      • 使用update/delete語句進行批次修改時,會導致個快取(region)全部失效
      • 使用save(), update()會區域性更新某個快取(region)
      • 使用原生SQL的update/delete,也會自動同步快取
    • 快取什麼時候更新

      • 直接修改資料庫的資料,快取是不會同步的(避免直接修改資料庫)