在需要大量读取数据库的应用中,缓存是提高性能的最基本操作之一。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