Hibernate的二級緩存功能是通過配置二級緩存插件來實現的,常用的二級緩存插件包括EHCache,OSCache,SwarmCache和JBossCache。本文主要介紹Hibernate緩存插件中EHCache配置。
1、引入EHCache相關jar包
<dependency> <groupId>net.sf.ehcache</groupId> <artifactId>ehcache-core</artifactId> <version>2.4.3</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>4.1.4.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context-support</artifactId> <version>4.1.4.RELEASE</version> </dependency> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-ehcache</artifactId> <version>4.3.8.Final</version> </dependency>
2、ehcache.xml配置
<?xml version="1.0" encoding="UTF-8"?> <ehcache> <!-- 指定一個文件目錄,當EhCache把數據寫到硬盤上時,將把數據寫到這個文件目錄下 --> <!-- <diskStore path="java.io.tmpdir"/> --> <diskStore path="d:/ehcache"/> <!-- 設定緩存的默認數據過期策略 --> <defaultCache maxElementsInMemory="100" eternal="false" overflowToDisk="true" timeToIdleSeconds="10" timeToLiveSeconds="20" diskPersistent="false" diskExpiryThreadIntervalSeconds="120"/> <!-- 該配置為spring緩存中的 --> <!-- <cache name="cacheTest" maxElementsInMemory="10" eternal="false" overflowToDisk="true" timeToIdleSeconds="3" timeToLiveSeconds="20"/> --> </ehcache>
參數解釋:
diskStore 緩存數據文件的存儲目錄
defaultCache 存的默認數據過期策略
cache 設置具體的命名緩存的數據過期策略
每個命名緩存代表一個緩存區域,命名緩存機制允許用戶在每個類以及類的每個集合的粒度上設置數據過期策略;
在defaultCache元素中:
maxElementsInMemory屬性設置緩存對象的最大數目;
eternal屬性指定是否永不過期,true為不過期,false為過期;
timeToldleSeconds屬性設置對象處於空閑狀態的最大秒數;
timeToLiveSeconds屬性設置對象處於緩存狀態的最大秒數;
overflowToDisk屬性設置內存溢出時是否將溢出對象寫入硬盤;
3、config.properties文件配置
#hibernate config hibernate.dialect = org.hibernate.dialect.MySQLDialect hibernate.show_sql = true hibernate.format_sql = false hibernate.hbm2ddl.auto = update hibernate.cache.use_second_level_cache = true hibernate.cache.use_query_cache = true hibernate.cache.provider_configuration_file_resource_path = ehcache.xml #hibernate4 config hibernate.cache.region.factory_class = org.hibernate.cache.ehcache.EhCacheRegionFactory #hibernate3 config #hibernate.cache.provider_class = org.hibernate.cache.EhCacheProvider
4、spring-hibernate.xml文件配置,配置到sessionfactory標簽當中
<bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean"> <!-- 注入數據源 相關信息看源碼 --> <property name="dataSource" ref="dataSource" /> <!-- hibernate配置信息 --> <property name="hibernateProperties"> <props> <prop key="hibernate.dialect">${hibernate.dialect}</prop> <prop key="hibernate.show_sql">${hibernate.show_sql}</prop> <prop key="hibernate.format_sql">${hibernate.format_sql}</prop> <prop key="hibernate.hbm2ddl.auto">${hibernate.hbm2ddl.auto}</prop> <!-- 配置二級緩存 --> <prop key="hibernate.cache.use_second_level_cache">${hibernate.cache.use_second_level_cache}</prop> <!-- hibernate4的二級緩存配置 --> <prop key="hibernate.cache.region.factory_class">${hibernate.cache.region.factory_class}</prop> <!-- hibernate3的二級緩存配置 --> <!-- <property name="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</property> --> <!-- 開啟查詢緩存 --> <prop key="hibernate.cache.use_query_cache">${hibernate.cache.use_query_cache}</prop> <!-- 發現沒有任何作用 --> <prop key="hibernate.cache.provider_configuration_file_resource_path">${hibernate.cache.provider_configuration_file_resource_path}</prop> </props> </property> <!-- 掃描hibernate注解配置的model --> <property name="packagesToScan" value="com.tz.model" /> <!-- hbm方式配置 --> <!--<property name="mappingDirectoryLocations"> <list> <value>classpath:com/tz/model</value> </list> </property> --> </bean>
5、添加需要進行二級緩存的實體類注解
6、測試是否成功
Session session = sf.openSession(); session.beginTransaction(); List<User> list = (List<User>)session.createQuery("from User").setCacheable(true).list(); for(User u:list){ System.out.println(u.getName()); } session.getTransaction().commit(); session.close(); System.out.println("-----------------分割線------------------"); Session session2 = sf.openSession(); session2.beginTransaction(); List<User> list2 = (List<User>)session2.createQuery("from User").setCacheable(true).list(); for(User u:list2){ System.out.println(u.getName()); } session2.getTransaction().commit(); session2.close();
說明:
需要使用查詢緩存時,需要設置 setCacheable(true)
因為二級緩存是sessionfactory級別的緩存,可以跨域session進行調用,所以檢驗其是否成功運用了兩個session。
第一個session使用查詢緩存和list方式,查詢出該表的所以實體信息,查詢緩存將實體的id集合進行緩存,二級緩存則將其中的實體進行緩存。
第二個session執行同樣的查詢語句,所以直接從查詢緩存中提取第一次查詢結果集即實體id的集合,然后再根據實體id從二級緩存中提取實體信息,所以第二個session沒有進行任何數據庫操作。
執行結果:
二級緩存和查詢緩存結果顯示均成功。