} } }

    spring-ehcache缓存设备(注解体式格式)

    添加时间:2013-6-11 点击量:

    spring cache

    Spring 3.1 引入了激动听心的基于注释(annotation)的缓存(cache)技巧,它本质上不是一个具体的缓存实现规划(例如 EHCache 或者 OSCache),而是一个对缓存应用的抽象,经由过程在既有代码中添加少量它定义的各类 annotation,即可以或许达到缓存办法的返回对象的结果。

    Spring 的缓存技巧还具备相当的灵活性,不仅可以或许应用 SpEL(Spring Expression Language)来定义缓存的 key 和各类 condition,还供给开箱即用的缓存姑且存储规划,也支撑和主流的专业缓存例如 EHCache 集成。

    其特点总结如下:

    • 经由过程少量的设备 annotation 注释即可使得既有代码支撑缓存
    • 支撑开箱即用 Out-Of-The-Box,即不消安装和安排额外第三方组件即可应用缓存
    • 支撑 Spring Express Language,能应用对象的任何属性或者办法来定义缓存的 key 和 condition
    • 支撑 AspectJ,并经由过程其实现任何办法的缓存支撑
    • 支撑自定义 key 和自定义缓存经管者,具有相当的灵活性和扩大性

    本人首要讲解spring与ehcache整合办法(基于maven项目),至于spring cache 具体介绍请参考《注解驱动的spring cache 缓存介绍》,为了能更好的懂得,建议在看本文前先把这篇的文章的例子做一遍。

    maven jar包筹办工作

    首要须要如下几个

    slf4j-log4j12 (log4j日记)

    ehcache-core (ehcache核心包)

    spring-webmvc (spring webmvc)

    spring-context-support(spring 高低文扩大包)

    测试须要

    junit

    spring-test

    好了以上这些足够,不消再添加其他的内容。当然maven项目会主动将依附报加载进来。附一张jar包图

    再附上pom 文件设备:

            <dependency>
    
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-log4j12</artifactId>
    <version>1.7.5</version>
    </dependency>
    <dependency>
    <groupId>net.sf.ehcache</groupId>
    <artifactId>ehcache-core</artifactId>
    <version>2.6.6</version>
    </dependency>
    <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-webmvc</artifactId>
    <version>3.2.3.RELEASE</version>
    </dependency>
    <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context-support</artifactId>
    <version>3.2.3.RELEASE</version>
    </dependency>
    <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-test</artifactId>
    <version>3.2.3.RELEASE</version>
    <scope>test</scope>
    </dependency>
    <dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.10</version>
    <scope>test</scope>
    </dependency>

    设备spring


    Spring-cache-anno.xml 文件:


    <?xml version=1.0 encoding=UTF-8?>
    
    <beans xmlns=http://www.springframework.org/schema/beans
    xmlns:xsi
    =http://www.w3.org/2001/XMLSchema-instance xmlns:p=http://www.springframework.org/schema/p
    xmlns:aop
    =http://www.springframework.org/schema/aop xmlns:context=http://www.springframework.org/schema/context
    xmlns:jee
    =http://www.springframework.org/schema/jee xmlns:tx=http://www.springframework.org/schema/tx
    xmlns:util
    =http://www.springframework.org/schema/util xmlns:mvc=http://www.springframework.org/schema/mvc
    xmlns:tool
    =http://www.springframework.org/schema/tool xmlns:cache=http://www.springframework.org/schema/cache
    xsi:schemaLocation
    =
    http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.1.xsd
    http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
    http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd
    http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-3.1.xsd
    http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.1.xsd
    http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.1.xsd
    http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.1.xsd
    http://www.springframework.org/schema/tool http://www.springframework.org/schema/tool/spring-tool-3.1.xsd
    http://www.springframework.org/schema/cache http://www.springframework.org/schema/cache/spring-cache-3.1.xsd

    default-lazy-init
    =true>
    <bean id=accountServiceBean1 class=com.cacheOfAnno.AccountService />
    <!-- 对指定包中的所有类进行扫描,以完成bean创建和主动依附注入的功能 -->
    <context:component-scan base-package=com.cacheOfAnno />
    <cache:annotation-driven cache-manager=cacheManager />
    <!-- cacheManager工厂类 -->
    <bean id=cacheManagerFactory class=org.springframework.cache.ehcache.EhCacheManagerFactoryBean
    p:configLocation
    =classpath:ehcache.xml />
    <!-- 声明cacheManager -->
    <bean id=cacheManager class=org.springframework.cache.ehcache.EhCacheCacheManager
    p:cacheManager-ref
    =cacheManagerFactory />
    </beans>

    设备ehcache


    <?xml version=1.0 encoding=UTF-8?>
    
    <ehcache xmlns:xsi=http://www.w3.org/2001/XMLSchema-instance
    xsi:noNamespaceSchemaLocation
    =ehcache.xsd Check=true
    monitoring
    =autodetect dynamicConfig=true>
    <!-- <diskStore path=java.io.tmpdir /> 体系姑且文件目次 -->
    <!--
    设备自定义缓存
    maxElementsInMemory:缓存中容许创建的最大对象数
    eternal:缓存中对象是否为永远的,若是是,超时设置将被忽视,对象从不过期。
    timeToIdleSeconds:缓存数据的钝化时候,也就是在一个元素灭亡之前,
    两次接见时候的最大时候间隔值,这只能在元素不是永远驻留时有效,
    若是该值是 0 就意味着元素可以平息无穷长的时候。
    timeToLiveSeconds:缓存数据的生活生计时候,也就是一个元素从构建到灭亡的最大时候间隔值,
    这只能在元素不是永远驻留时有效,若是该值是0就意味着元素可以平息无穷长的时候。
    overflowToDisk:内存不足时,是否启用磁盘缓存。
    memoryStoreEvictionPolicy:缓存满了之后的镌汰算法。
    -->
    <diskStore path=E:/cachetmpdir /> <!--指定缓存文件目次-->
    <defaultCache maxElementsInMemory=10000 eternal=false
    timeToIdleSeconds
    =120 timeToLiveSeconds=120 overflowToDisk=true
    maxElementsOnDisk
    =10000000 diskPersistent=false
    diskExpiryThreadIntervalSeconds
    =120 memoryStoreEvictionPolicy=LRU />
    <!--
    <cache name=accountCache maxElementsInMemory=10000
    maxElementsOnDisk=1000 eternal=false overflowToDisk=true
    diskSpoolBufferSizeMB=20 timeToIdleSeconds=300 timeToLiveSeconds=600
    memoryStoreEvictionPolicy=LFU />
    -->
    <cache name=accountCache maxElementsInMemory=0
    maxElementsOnDisk
    =10000000 eternal=true overflowToDisk=true
    diskSpoolBufferSizeMB
    =50 />
    </ehcache>

    测试缓存


    测试文件 Main.java


    package com.cacheOfAnno;
    

    import org.springframework.context.ApplicationContext;
    import org.springframework.context.support.ClassPathXmlApplicationContext;

    import com.bean.Account;

    public class Main {

    /
    @param args
    /
    public static void main(String[] args) {

    ApplicationContext context
    = new ClassPathXmlApplicationContext(spring-cache-anno.xml);// 加载 spring 设备文件

    AccountService s
    = (AccountService) context.getBean(accountServiceBean1);
    // 第一次查询,应当走数据库
    System.out.print(first query...);
    s.getAccountByName(
    som);
    // 第二次查询,应当不查数据库,直接返回缓存的值
    System.out.print(second query...);
    s.getAccountByName(
    som);
    System.out.println();

    System.out.println(
    start testing clear cache...);
    // 更新某个记录的缓存,起首机关两个账号记录,然跋文录到缓存中
    Account account1 = s.getAccountByName(somebody1);
    Account account2
    = s.getAccountByName(somebody2);
    // 开端更新此中一个
    account1.setId(1212);
    s.Account(account1);
    s.getAccountByName(
    somebody1);// 因为被更新了,所以会查询数据库
    s.getAccountByName(somebody2);// 没有更新过,应当走缓存
    s.getAccountByName(somebody1);// 再次查询,应当走缓存
    // 更新所有缓存
    System.out.println();
    s.reload();
    s.getAccountByName(
    somebody1);// 应当会查询数据库
    s.getAccountByName(somebody2);// 应当会查询数据库
    s.getAccountByName(somebody1);// 应当走缓存
    s.getAccountByName(somebody2);// 应当走缓存
    }

    }
     

    测试成果:


    first query...real querying db...som
    
    second query
    ...
    start testing clear cache
    ...
    real querying db
    ...somebody1
    real querying db
    ...somebody2
    real db
    ...somebody1
    real querying db
    ...somebody1
    real querying db
    ...somebody2
    real querying db
    ...somebody1

    real querying db
    ...somebody1
    real querying db
    ...somebody2
    real querying db
    ...somebody1
    real querying db
    ...somebody2

    附项目文件布局(具编制子)可以在懂得完 spring cache 进行批改。这里就不供给项目源码了。


    我所有的自负皆来自我的自卑,所有的英雄气概都来自于我的软弱。嘴里振振有词是因为心里满是怀疑,深情是因为痛恨自己无情。这世界没有一件事情是虚空而生的,站在光里,背后就会有阴影,这深夜里一片寂静,是因为你还没有听见声音。—— 马良《坦白书》
    分享到: