ehcache-2.7.5.jar(主程序) ehcache-spring-annotations-1.2.0.jar(註解) guava-r09.jar(依賴) slf4j-api-1.6.6.jar(依賴)
####spring配置中須要添加以下內容 頭部html
xmlns:cache="http://www.springframework.org/schema/cache" xsi:schemaLocation http://www.springframework.org/schema/cache http://www.springframework.org/schema/cache/spring-cache-3.2.xsd <!-- 緩存配置 --> <!-- 啓用緩存註解功能(請將其配置在Spring主配置文件中) --> <cache:annotation-driven cache-manager="cacheManager" /> <!-- Spring本身的基於java.util.concurrent.ConcurrentHashMap實現的緩存管理器(該功能是從Spring3.1開始提供的) --> <!-- <bean id="cacheManager" class="org.springframework.cache.support.SimpleCacheManager"> <property name="caches"> <set> <bean name="myCache" class="org.springframework.cache.concurrent.ConcurrentMapCacheFactoryBean"/> </set> </property> </bean> --> <!-- 若只想使用Spring自身提供的緩存器,則註釋掉下面的兩個關於Ehcache配置的bean,並啓用上面的SimpleCacheManager便可 --> <!-- Spring提供的基於的Ehcache實現的緩存管理器 --> <bean id="cacheManagerFactory" class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean"> <property name="configLocation" value="classpath:ehcache.xml" /> </bean> <bean id="cacheManager" class="org.springframework.cache.ehcache.EhCacheCacheManager"> <property name="cacheManager" ref="cacheManagerFactory" /> </bean>
####ehcache.xmljava
<ehcache> <diskStore path="java.io.tmpdir"/> <defaultCache maxElementsInMemory="1000" eternal="false" timeToIdleSeconds="120" timeToLiveSeconds="120" overflowToDisk="false"/> <cache name="myCache" maxElementsOnDisk="20000" maxElementsInMemory="2000" eternal="false" overflowToDisk="true" diskPersistent="true"/> <cache name="cacheTest" maxElementsOnDisk="20000" maxElementsInMemory="2000" eternal="false" overflowToDisk="true" diskPersistent="true"/> </ehcache>
cache通常用在和數據庫交互的地方servicespring
示例 package com.service; import java.util.Date; import java.util.HashMap; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import javax.annotation.Resource; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.springframework.cache.annotation.CacheEvict; import org.springframework.cache.annotation.CachePut; import org.springframework.cache.annotation.Cacheable; import org.springframework.stereotype.Service; import com.aft.site.yey.dao.NoticeDao; import com.aft.site.yey.entity.Notice; import com.app.jdbc.core.ToolUtil; /** * @author: yangyang 2013年10月21日 * @since JDK 1.6 */ @Service("XXXNoticeService") public class NoticeService { private static Log logger = LogFactory.getLog(NoticeService.class); @Resource(name = "XXXNoticeDao") private NoticeDao dao; /** * status = 0 指未刪除 * */ @Cacheable(value = "cacheTest",key="'noticelist'") public List<Notice> topN(int begin, int end) { LinkedHashMap<String, String> orderby = new LinkedHashMap<String, String>(); orderby.put("publish_time", "desc"); Map<String, String> where = new HashMap<String, String>(); where.put(dao.STATUS + " = ? ", dao.NORMAL_CODE.toString()); //TODO:delete System.out.println("list:"); logger.info("[list ]"); return dao.find(where, orderby, begin, end); } @CacheEvict(value = "cacheTest",key="'noticelist'") public void delete(String id) { //TODO:delete System.out.println("delete:"); logger.info("delete "); dao.delete(id, false); } @CacheEvict(value = "cacheTest", allEntries = true) public void save(Notice notice) { notice.setRowid(ToolUtil.getUUID()); notice.setStatus(dao.NORMAL_CODE); notice.setPublish_time(new Date()); // TODO:yeyid的得到方式 notice.setYey_id("123"); dao.insert(notice); //TODO:delete System.out.println("save:"); logger.info("save "); } public Notice get(String id) { return dao.findById(id); } //@CachePut(value = "cacheTest",key="#notice.getRowid()") public void update(Notice notice) { Map<String, String> set = new HashMap<String, String>(); LinkedHashMap<String, String> where = new LinkedHashMap<String, String>(); set.put("title", notice.getTitle()); set.put("author", notice.getAuthor()); set.put("content", notice.getContent()); where.put(dao.getIdColumnName() + "=?", notice.getRowid()); dao.update(set, where); System.out.println("update:"); logger.info("update "); } }
cache主要註解使用:@Cacheable,@CacheEvict,@CachePut數據庫
緩存是這樣的,取值時在方法(A)調用前查一下緩存中是否有目標值,緩存存在的話直接從緩存中拿出再也不去執行方法(A),這也是最基本的*@Cacheable*的概念;apache
緩存中有值須要更新怎麼辦?使用@CacheEvict來更新,這個註解的意思是刪除掉緩存裏面的某個值,從而達到更新緩存的效果。關於緩存更新,例如,取topN個對象,第一次取的時候好比是前1~10個,緩存中存這1~10的一個集合對象,第二次取的時候直接從緩存中拿,這沒問題,如今是這樣的,假設數據庫中刪除了1~10個元素中的任意一個值,這樣數據庫中的topN與緩存中的topN就不一樣步了,下次你在前臺取topN的時候,由於緩存裏面有這個對象,根據以前的介紹(取值時在方法(A)調用前查一下緩存中是否有目標值,緩存存在的話直接從緩存中拿出再也不去執行方法(A)),方法A被略過,查的值不是真正的topN了,所以須要在add或者delete以後刪除掉原來的緩存,保持數據一致。其餘情景請自行考慮。api
根據緩存的特性,如何作到既要保證方法被調用,又但願結果被緩存呢?直接使用*@CachePut*,他與@Cacheable的區別就在與方法是會被執行的。緩存
註解裏面屬性解釋,@Cacheable 與@CachePut同樣, @CacheEvict還有和刪除有關的兩個屬性:mvc
value:緩存的名稱,在spring配置文件中定義,必須指定至少一個app
key:緩存的key,(緩存是鍵值對兒)能夠爲空,若是指定要按照 SpEL 表達式編寫,若是不指定,則缺省按照方法的全部參數進行組合spa
condition:緩存的條件,能夠爲空,使用SpEL 編寫,返回 true 或者 false,只有爲 true 才進行緩存
allEntries:是否清空全部緩存內容,缺省爲 false,若是指定爲 true,則方法調用後將當即清空全部緩存
beforeInvocation:是否在方法執行前就清空,缺省爲 false,若是指定爲 true,則在**方法尚未執行的時候就清空緩存*,缺省狀況下爲false,這樣若是方法執行拋出異常,則不會清空緩存
集羣的同步問題,未完待續。
###很是詳細的spring mvc和cache的使用博客 http://www.ibm.com/developerworks/cn/opensource/os-cn-spring-cache/
###官網文檔 http://docs.spring.io/spring/docs/3.1.0.M1/spring-framework-reference/html/cache.html
###ehcache介紹 http://my.oschina.net/coolfire368/blog/123377
###spring mvc整合 ehcache http://blog.csdn.net/jadyer/article/details/12257865