用第三方类库Simple Sring Memcached实现spring的抽象缓存

在需要大量读取数据库的应用中,缓存是提高性能的最基本操作之一。spring3.1发布了一个叫做缓存抽象Cache Abstraction的新特性!它为开发人员提供了一种容易实现的,透明的和解耦的缓存解决方案。Memcached就是一种广泛应用的分布式缓存系统。本文讨论如何把memcached整合到spring应用中。因为spring只是直接支持Ehcache和ConcurrentHashMap,所以,我们要用第三方类库Simple Spring Memcache来挖掘spring的缓存抽象的性能

CREATE  TABLE IF NOT EXISTS `adconnect`.`books` (
  `book_id` INT NOT NULL AUTO_INCREMENT ,
  `book_name` VARCHAR(500) NULL ,
  `book_author` VARCHAR(500) NULL ,
  `category` VARCHAR(500) NULL ,
  `numpages` INT NULL ,
  `price` FLOAT NULL ,
  PRIMARY KEY (`book_id`) )
ENGINE = InnoDB;
Simple spring Memcached类库: https://code.google.com/p/simple-spring-memcached/downloads/list

译者注:本工程需要的类很多,本问最后提供的源代码含有库,无需从上述地址下载。

springcache.xml

<cache:annotation-driven/>

    <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
        <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
        <property name="url" value="jdbc:mysql://localhost:3306/adconnect"/>
        <property name="username" value="root"/>
        <property name="password" value=""/>
    </bean>

    <!-- Hibernate session factory -->
    <bean id="sessionFactory"
          class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">

        <property name="dataSource">
            <ref bean="dataSource"/>
        </property>

        <property name="hibernateProperties">
            <props>
                <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
                <prop key="hibernate.show_sql">true</prop>
                <prop key="hibernate.jdbc.batch_size">20</prop>
                <prop key="hibernate.connection.release_mode">after_statement</prop>
            </props>
        </property>

        <property name="annotatedClasses">
            <list>
                <value>com.aranin.spring.vo.BookVO</value>
            </list>
        </property>

    </bean>





    <bean name="cacheManager" class="com.google.code.ssm.spring.SSMCacheManager">
        <property name="caches">
            <set>
                <bean class="com.google.code.ssm.spring.SSMCache">
                    <constructor-arg name="cache" index="0" ref="defaultCache"/>
                    <!-- 5 minutes -->
                    <constructor-arg name="expiration" index="1" value="300"/>
                    <!-- @CacheEvict(..., "allEntries" = true) doesn't work -->
                    <constructor-arg name="allowClear" index="2" value="false"/>
                </bean>
            </set>
        </property>

    </bean>

    <bean name="defaultCache" class="com.google.code.ssm.CacheFactory">
        <property name="cacheName" value="defaultCache"/>
        <property name="cacheClientFactory">
            <bean name="cacheClientFactory" class="com.google.code.ssm.providers.xmemcached.MemcacheClientFactoryImpl"/>
        </property>
        <property name="addressProvider">
            <bean class="com.google.code.ssm.config.DefaultAddressProvider">
                <property name="address" value="127.0.0.1:11211"/>
            </bean>
        </property>
        <property name="configuration">
            <bean class="com.google.code.ssm.providers.CacheConfiguration">
                <property name="consistentHashing" value="true"/>
            </bean>
        </property>

    </bean>

      <bean id="bookDAO" class="com.aranin.spring.dao.impl.BookDAOImpl" >
		<property name="sessionFactory" ref="sessionFactory" />
	</bean>

    <bean id="cachedBookDAO" class="com.aranin.spring.dao.impl.CachedBookDAOImpl" >
		<property name="sessionFactory" ref="sessionFactory" />
	</bean>


</beans>
SSMCacheManager扩展了org.springframework.cache.support.AbstractCacheManager,它是一个抽象类,是底层缓存的管理者。
SSMCAche实现了org.springframework.cache.Cache接口,它实际上是底层缓存客户api的包装类。


注释驱动的缓存
spring使用注释标注要缓存的方法。下面是spring框架所定义的注释:
@Cacheable:这个注释用来标注一个方法,该方法的结果需要被缓存。如果要调用一个被cacheable注释了的方法,那么,spring将检查该方法的结果是否被缓存了。如果缓存中有,那么就直接从缓存中取结果。
@CachePut:用这个注释标注的方法会永远运行,它们的结果会放到缓存中。
@CacheEvict:把结果从缓存中抹掉.该方法通常用于这种情景:结果对象被更新了,因此旧对象需要从缓存中清洗掉。
@Caching:如果需要把同种类型的多个注释加到一个方法上面,用这个注释。

演示:

 @Override
    @Cacheable(value = "defaultCache", key = "#book_id")
    public BookVO get(int book_id) throws Exception {
    	System.out.println("刘利新");
        BookVO bookVO = null;
		try{
			Query query = getSession().createQuery("from BookVO bookVO where bookVO.book_id=:book_id");
			query.setLong("book_id", book_id);
			bookVO =  (BookVO)query.uniqueResult();
            getSession().close();
		}catch(HibernateException he){
			log.error("Error in finding a bookVO : " + he);
            throw new Exception("Error in finding adPicVO by book_id for book_id : " + bookVO, he);
		}
		return bookVO;
    }

原文: http://www.javacodegeeks.com/2013/06/simple-spring-memcached-spring-caching-abstraction-and-memcached.html

源代码:http://pan.baidu.com/share/link?shareid=227877044&uk=3878681452



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring框架通过Spring Cache提供了一套强大的缓存体系,可以轻松地实现缓存数据,提高应用程序的性能。Spring框架提供了三个主要的注解来实现缓存:@Cacheable、@CachePut和@CacheEvict。 @Cacheable注解用于将方法的结果缓存起来,以便在下次请求时,如果参数相同,则可以直接从缓存中获取结果,而不需要重新计算。该注解适用于如果计算结果比较耗时,或者需要从数据库或其他外部资源中提取数据的情况。 @CachePut注解用于更新缓存中的数据。它与@Cacheable注解类似,但不同的是,它总是更新缓存数据,而不管缓存中是否已经存在该key的值。所以,可以使用这个注解来更新缓存中的数据。 @CacheEvict注解用于从缓存中删除数据。它在需要删除缓存数据的情况下使用。它可以删除指定的key对应的缓存,也可以清空所有缓存数据。 这三个注解都有一个可选参数Named:如果指定了该参数,则缓存将使用指定的名称使用。如果未指定,则使用默认的名称。可以使用不同名称的缓存来存储不同类型的数据,并使用不同的缓存策略来控制它们的存储方式。 除了Spring自带的缓存提供者之外,还可以使用其他的缓存提供者,如Ehcache、Redis、Memcached等等。在使用缓存时,需要注意的是,不同的缓存提供者之间可能会有不同的限制和性能差异。因此,必须根据实际情况选择最适合的缓存提供者和缓存策略,以获取最好的性能和可靠性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值