spring結合hibernate cache配置(轉)

一、 applicationContext.xml
< bean id ="sessionFactory"
        class
="org.springframework.orm.hibernate3.LocalSessionFactoryBean" >
       
< property name ="hibernateProperties" >
           
< props >
                ......
               
< prop key ="hibernate.cache.provider_class" >
                    org.hibernate.cache.EhCacheProvider
               
</ prop >
               
<!-- 若是用查詢緩存,就去掉註釋
                <prop key="hibernate.cache.use_query_cache">true</prop>
               
-->
           
</ props >
       
</ property >
        ......
   
</ bean >
二、 在classpath下(通常都是src)下創建ehcache.xml文件,這個文件在hibernate-x.x/etc的目錄下有個樣板,拷貝過來便可

3 、裏面的defaultCache是默認的緩存配置,本身能夠增長制定實體的緩存配置,例如
<cache name="xxx.Entity1" maxElementsInMemory="500" eternal="false" timeToLiveSeconds="7200" timeToIdleSeconds="3600" overflowToDisk="true" />
建議自定義cache時,cache名字和類路徑名相同。
(1)不要使用默認緩存策略defaultCache(多個class共享)
(2)不要給cache name另外起名
不然繼承AbstractTransactionalDataSourceSpringContextTests作測試時,拋出
org.hibernate.cache.CacheException: java.lang.IllegalStateException: The com.sitechasia.occ.core.base.ExampleForTest Cache is not alive
四、 pojo與ehcache.xml的配置關係
以com.gjun.vo.Person爲例子
在*.hbm.xml中配置:
<class name="com.gjun.vo.Person" table="perosn" lazy="false">
<cache usage="read-write" region="ehcache.xml中的name的屬性值"/>注意:這一句須要緊跟在class標籤下面,其餘位置無效。
ehcache.xml文件主體以下
<defaultCache
        maxElementsInMemory="10000"
        eternal="false"
        timeToIdleSeconds="120"
        timeToLiveSeconds="120"
        overflowToDisk="true"
        />
<cache
        name="com.gjun.vo.Person"
        maxElementsInMemory="10000"
        eternal="false"
        timeToIdleSeconds="300"
        timeToLiveSeconds="600"
        overflowToDisk="true"
/>
hbm文件查找cache方法名的策略:若是不指定hbm文件中的region="ehcache.xml中的name的屬性值",則使用name名爲com.gjun.vo.Person的cache,若是不存在與類名匹配的cache名稱,則用defaultCache。
若是Person包含set集合,則須要另行指定其cache
例如Person包含addresses Set集合,則須要
添加以下配置到ehcache.xml中
<cache
       name="com.gjun.vo.Address"
       maxElementsInMemory="10000"
       eternal="false" timeToIdleSeconds="300"
       timeToLiveSeconds="600"
       overflowToDisk="true"
/>
另,針對查詢緩存的配置以下:
<cache
         name="org.hibernate.cache.UpdateTimestampsCache"
         maxElementsInMemory="5000"
         eternal="true"
         overflowToDisk="true"
/>
<cache
       name="org.hibernate.cache.StandardQueryCache"
       maxElementsInMemory="10000"
       eternal="false"
       timeToLiveSeconds="120"
       overflowToDisk="true"
/>
類級緩存,配置完了自動就用了

查詢緩存須要激活一下
query.setCacheable(true);//激活查詢緩存
query.setCacheRegion("xxx");
//你的查詢語句,當你load、get、list、iterator時,都會填充

EHCache.xml要作相應配置,若是不作配置那麼就執行默認的緩存配置StandardQueryCache ,這個你也會,確定能明白
<cache name="xxx" maxElementsInMemory="50" eternal="false" timeToIdleSeconds="3600"
timeToLiveSeconds="7200" overflowToDisk="true"/>
 
五、 選擇緩存策略依據:
<cache
usage="transactional|read-write|nonstrict-read-write|read-only" (1)
/>
ehcache不支持transactional,其餘三種能夠支持。
read-only:無需修改, 那麼就能夠對其進行 只讀 緩存,注意,在此策略下,若是直接修改數據庫,即便可以看到前臺顯示效果,可是將對象修改至cache中會報error,cache不會發生做用。另:刪除記錄會報錯,由於不能在read-only模式的對象從cache中刪除。
read-write:須要更新數據,那麼使用 讀/寫緩存 比較合適,前提:數據庫不能夠爲serializable transaction isolation level(序列化事務隔離級別)
nonstrict-read-write:只偶爾須要更新數據(也就是說,兩個事務同時更新同一記錄的狀況很不常見),也不須要十分嚴格的事務隔離,那麼比較適合使用 非嚴格讀/寫緩存策略。
 
六、 調試時候使用log4j的log4j.logger.org.hibernate.cache=debug,更方便看到ehcache的操做過程,主要用於調試過程,實際應用發佈時候,請註釋掉,以避免影響性能。
 
七、 使用ehcache,打印sql語句是正常的,由於query cache設置爲true將會建立兩個緩存區域:一個用於保存查詢結果集(org.hibernate.cache.StandardQueryCache); 另外一個則用於保存最近查詢的一系列表的時間戳(org.hibernate.cache.UpdateTimestampsCache)。請注意:在查詢緩存中,它並不緩存結果集中所包含的實體的確切狀態;它只緩存這些實體的標識符屬性的值、以及各值類型的結果。須要將打印sql語句與最近的cache內容相比較,將不一樣之處修改到cache中,因此查詢緩存一般會和二級緩存一塊兒使用。
相關文章
相關標籤/搜索