spring4.x hibernate4.x 整合 ehcache 註解 annotate

廢話不說 直接貼源碼連接 :  https://git.oschina.net/alexgaoyh/alexgaoyh.git java


使用ehcache來提升系統的性能,如今用的很是多, 也支持分佈式的緩存,在hibernate當中做爲二級緩存的實現產品,能夠提升查詢性能。 git

pom.xml spring

<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-ehcache</artifactId>
    <version>4.1.6.Final</version>
    </dependency>



在項目的src下面添加ehcache的配置文件ehcache.xml 緩存

<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../config/ehcache.xsd">
	<!--
    Subdirectories can be specified below the property e.g. java.io.tmpdir/one
    -->
    <diskStore path="java.io.tmpdir"/>

    <!--
    Mandatory Default Cache configuration. These settings will be applied to caches
    created programmtically using CacheManager.add(String cacheName)
    -->
    <defaultCache
	     maxElementsInMemory="10000"
	     eternal="false"
	     timeToIdleSeconds="120"
	     timeToLiveSeconds="120"
	     overflowToDisk="true"
	     maxElementsOnDisk="10000000"
	     diskPersistent="false"
	     diskExpiryThreadIntervalSeconds="120"
	     memoryStoreEvictionPolicy="LRU"
     />
    
    <cache name="org.hibernate.cache.spi.UpdateTimestampsCache"
		   maxElementsInMemory="5000" 
	       eternal="true" 
	       overflowToDisk="true" />
	<cache name="org.hibernate.cache.internal.StandardQueryCache"
	       maxElementsInMemory="10000" 
	       eternal="false" 
	       timeToLiveSeconds="120"
	       overflowToDisk="true" />	
	
	<!--
	java文件註解查找cache方法名的策略:若是不指定java文件註解中的region="ehcache.xml中的name的屬性值", 
	則使用name名爲com.lysoft.bean.user.User的cache(即類的全路徑名稱), 若是不存在與類名匹配的cache名稱, 則用 defaultCache
	若是User包含set集合, 則須要另行指定其cache
	例如User包含citySet集合, 則也須要
	添加配置到ehcache.xml中
	-->    
    <cache name="javaClassName" maxElementsInMemory="2000" eternal="false" 
	       timeToIdleSeconds="120" timeToLiveSeconds="120"
	       overflowToDisk="true" />  
	    
</ehcache>
spring 集成hibernate 的配置文件中,添加以下配置
<!-- 開啓查詢緩存 -->
<prop key="hibernate.cache.use_query_cache">true</prop>
<!-- 開啓二級緩存 -->
<prop key="hibernate.cache.use_second_level_cache">true</prop>
<!-- 高速緩存提供程序 --> 
<!-- 因爲spring也使用了Ehcache, 保證雙方都使用同一個緩存管理器 -->
<prop key="hibernate.cache.region.factory_class">
     org.hibernate.cache.ehcache.SingletonEhCacheRegionFactory
</prop>
Spring也使用ehcache, 因此也須要在spring配置文件中添加ehcache的配置
<!-- cacheManager, 指定ehcache.xml的位置 --> 
	<bean id="cacheManagerEhcache" class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean">
		<property name="configLocation">
        	<value>classpath:ehcache.xml</value>
        </property>
        <!-- 因爲hibernate也使用了Ehcache, 保證雙方都使用同一個緩存管理器 -->
        <property name="shared" value="true"/>
    </bean>
在類中定義:
@Entity  
@Table(name = "t_user")  
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE, region="javaClassName")  
public class User implements Serializable {  

}
默認狀況下二級緩存只會對load get 之類的方法緩存, 想list iterator 之類的方法也使用緩存 必須跟查詢緩存一塊兒使用, 重寫查詢方法 
.setCacheable(true)

criteria.setCacheable(true).list();


以後進行驗證 app

相關文章
相關標籤/搜索