spring + ehcache 整合

一:ehcache 简介

  ehCache 是一个纯Java的进程内缓存框架,具有快速、精干等特点,是Hibernate中默认的CacheProvider
  类似于做了数据库的一个备份,一定要注意使用ehcache时的数据脏读

二:spring 需要的知识点
  1 spring AOP 应用的几种方式:ProxyFactoryBean 动态代理,2.0版本之前;<aop> 标签 2.0版本之后
  2 spring 获取接入点信息:JoinPoint 和 ProceedingJoinPoint(限于环绕通知使用)

三:使用

  1 ehcache 配置:

<?xml version="1.0" encoding="UTF-8"?>

  <ehcache>
    <diskStore path="c:\\myapp\\cache"/>
    <defaultCache
        maxElementsInMemory="1"
        eternal="false"
        timeToIdleSeconds="120"
        timeToLiveSeconds="120"
        overflowToDisk="true"
        />
  <cache name="SYSTEM_CACHE"
        maxElementsInMemory="11"
        eternal="false"
        timeToIdleSeconds="300000"
        timeToLiveSeconds="600000"
        overflowToDisk="true"
        />
</ehcache>
             

  2 spring 配置文件:

<?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:tx="http://www.springframework.org/schema/tx" xmlns:context="http://www.springframework.org/schema/context"
    xmlns:aop="http://www.springframework.org/schema/aop" xmlns:jee="http://www.springframework.org/schema/jee"
    xmlns:util="http://www.springframework.org/schema/util" xmlns:lang="http://www.springframework.org/schema/lang"
    xmlns:jms="http://www.springframework.org/schema/jms" xmlns:security="http://www.springframework.org/schema/security"
    xmlns:dwr="http://www.directwebremoting.org/schema/spring-dwr"
    xmlns:jdbc="http://www.springframework.org/schema/jdbc"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
        http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd
        http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
        http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-3.0.xsd
        http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.0.xsd
        http://www.springframework.org/schema/lang http://www.springframework.org/schema/lang/spring-lang-3.0.xsd
        http://www.springframework.org/schema/jms http://www.springframework.org/schema/jms/spring-jms-3.0.xsd
        http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-3.0.xsd
        http://www.directwebremoting.org/schema/spring-dwr http://www.directwebremoting.org/schema/spring-dwr-2.0.xsd
        http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc-3.0.xsd">

    <!-- 激活annotation功能 -->
    <context:annotation-config />
    <!-- 开启使用@Transactional注解方式 -->
    <tx:annotation-driven transaction-manager="transactionManager"
        proxy-target-class="true" />
    <context:component-scan base-package="ehcache.*"
        scoped-proxy="targetClass">
    </context:component-scan>

    <!-- DataSource -->
    <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"
        destroy-method="close">
        <property name="driverClass" value="oracle.jdbc.driver.OracleDriver" />
        <property name="jdbcUrl" value="jdbc:oracle:thin:@localhost:1521/orcl" />
        <property name="user" value="oracle" />
        <property name="password" value="oracle" />
        <!-- 连接池其他配置 -->
        <property name="minPoolSize" value="2" />
        <property name="maxPoolSize" value="5" />
        <property name="maxIdleTime" value="60" />
        <property name="acquireIncrement" value="3" />
        <property name="maxStatements" value="10" />
        <property name="initialPoolSize" value="2" />
        <property name="idleConnectionTestPeriod" value="900" />
        <property name="numHelperThreads" value="10" />
    </bean>

    <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
        <property name="dataSource" ref="dataSource"></property>
    </bean>
    <bean id="cacheDao" class="ehcache.integration.dao.CacheDao">
        <property name="jdbcTemplate" ref="jdbcTemplate" />
    </bean>
    <bean id="cacheService" class="ehcache.integration.service.CacheService">
        <property name="cacheDao" ref="cacheDao" />
    </bean>

    <!-- 引用ehCache的配置 -->
    <bean id="defaultCacheManager"
        class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean">
        <property name="configLocation">
            <value>WebContent/resource/ehcache.xml</value>
        </property>
    </bean>

    <!-- 定义ehCache的工厂,并设置所使用的Cache name -->
    <bean id="ehCache" class="org.springframework.cache.ehcache.EhCacheFactoryBean">
        <property name="cacheManager">
            <ref local="defaultCacheManager" />
        </property>
        <property name="cacheName">
            <value>SYSTEM_CACHE</value>
        </property>
    </bean>

    <!-- 切面 -->
    <bean id="aspectClass" class="ehcache.integration.interceptor.MethodCacheInterceptor">
        <property name="cache">
            <ref local="ehCache" />
        </property>
    </bean>

    <aop:config proxy-target-class="true">
        <aop:aspect ref="aspectClass">
        <aop:pointcut expression="execution(* ehcache.integration.service.*Service.*(..))" id="servicePointcut"/>
        <aop:around method="doIntercept" pointcut-ref="servicePointcut"/>
        </aop:aspect>
    </aop:config>

</beans>

  3 切面及通知方法定义:

  

package ehcache.integration.interceptor;

import java.io.Serializable;
import net.sf.ehcache.Cache;
import net.sf.ehcache.Element;
import org.aspectj.lang.ProceedingJoinPoint;

public class MethodCacheInterceptor {

    private Cache cache;

    public void setCache(Cache cache) {
        this.cache = cache;
    }

    /**
     * 拦截Service/DAO的方法,并查找该结果是否存在,如果存在就返回cache中的值,
     * 否则,返回数据库查询结果,并将查询结果放入cache
     * 1) JoinPoint
     * java.lang.Object[] getArgs():获取连接点方法运行时的入参列表;
     * Signature getSignature() :获取连接点的方法签名对象;
     * java.lang.Object getTarget() :获取连接点所在的目标对象;
     * java.lang.Object getThis() :获取代理对象本身;
     * 2)ProceedingJoinPoint (只能用于环绕通知)
     * ProceedingJoinPoint继承JoinPoint子接口,它新增了两个用于执行连接点方法的方法:
     * java.lang.Object proceed() throws java.lang.Throwable:通过反射执行目标对象的连接点处的方法;
     * java.lang.Object proceed(java.lang.Object[] args) throws java.lang.Throwable:通过反射执行目标对象连接点处的方法
     * @throws Throwable
     */
    public Object doIntercept(ProceedingJoinPoint joinPoint) throws Throwable {
        String targetName = joinPoint.getTarget().getClass().getName();
        String methodName = joinPoint.getSignature().getName();
        Object[] arguments = joinPoint.getArgs();

        String cacheKey = getCacheKey(targetName, methodName, arguments);
        Element element = cache.get(cacheKey);

        Object result = null;
        if (element == null) {
            result = joinPoint.proceed();
            element = new Element(cacheKey, (Serializable)result);
            cache.put(element);
        }
        return element.getValue();
    }

    /**
     * 获得cache key的方法,cache key是Cache中一个Element的唯一标识
     * cache key包括 包名+类名+方法名,如com.co.cache.service.UserServiceImpl.getAllUser
     */
    private String getCacheKey(String targetName, String methodName, Object[] arguments) {
        StringBuffer sb = new StringBuffer();
        sb.append(targetName).append(".").append(methodName);
        if ((arguments != null) && (arguments.length != 0)) {
            for (int i = 0; i < arguments.length; i++) {
                sb.append(".").append(arguments[i]);
            }
        }
        return sb.toString();
    }

}

  4 系统sevice 方法:

package ehcache.integration.service;

import java.util.List;

import spring.tx.bean.TxdemoBean;
import ehcache.integration.dao.CacheDao;

/**
 * 类描述:  服务层
 * @author shiro
 * @version 1.0  CreateDate: 2015-2-2
 *
 * @history:
 * @updateDate            @updatePerson        @declare
 *
 */
public class CacheService {

    private CacheDao cacheDao;

    /**
     * 方法描述:
     *
     */
    public List<TxdemoBean> getList(){
        List<TxdemoBean> rows = cacheDao.selectList();
        return rows;
    }

    /**
     * @return the cacheDao
     */
    public CacheDao getCacheDao() {
        return cacheDao;
    }

    /**
     * @param cacheDao the cacheDao to set
     */
    public void setCacheDao(CacheDao cacheDao) {
        this.cacheDao = cacheDao;
    }

}

  5 调用入口:

package ehcache.integration;

import java.util.List;

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

import spring.tx.bean.TxdemoBean;
import ehcache.integration.service.CacheService;

/**
 * 类描述:  ehcache 集成spring
 * @author shiro
 * @version 1.0  CreateDate: 2015-4-20
 *
 * @updateDate
 * @updatePerson
 * @declare
 */
public class Acce {

    public static void main(String[] args) {
        ApplicationContext context = new FileSystemXmlApplicationContext(
                "WebContent/resource/applicationContext-ehcache.xml");
        CacheService cacheService = (CacheService) context.getBean("cacheService");
//                CacheManager cacheManager = (CacheManager)context.getBean("cacheManager");
//
//                Cache levelOneCache = cacheManager.getCache("SYSCACHE");

        for (int i = 0; i < 5; i++) {
            List<TxdemoBean> rows = cacheService.getList();
            for (TxdemoBean txdemoBean : rows) {
                System.out.println(txdemoBean.toString());
            }
        }

    }
}
时间: 2024-10-10 11:32:20

spring + ehcache 整合的相关文章

Ehcache 整合Spring 使用页面、对象缓存(转载)

Ehcache在很多项目中都出现过,用法也比较简单.一般的加些配置就可以了,而且Ehcache可以对页面.对象.数据进行缓存,同时支持集群/分布式缓存.如果整合Spring.Hibernate也非常的简单,Spring对Ehcache的支持也非常好.EHCache支持内存和磁盘的缓存,支持LRU.LFU和FIFO多种淘汰算法,支持分布式的Cache,可以作为Hibernate的缓存插件.同时它也能提供基于Filter的Cache,该Filter可以缓存响应的内容并采用Gzip压缩提高响应速度.

ehcache整合spring本地接口方式

一.简介 ehcache整合spring,可以通过使用echache的本地接口,从而达到定制的目的.在方法中根据业务逻辑进行判断,从缓存中获取数据或将数据保存到缓存.这样让程序变得更加灵活. 本例子使用maven构建,需要的依赖如下: <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>3.2

Spring Boot整合EhCache

本文讲解Spring Boot与EhCache的整合. 1 EhCache简介 EhCache 是一个纯Java的进程内缓存框架,具有快速.精干等特点,是Hibernate中默认CacheProvider.Ehcache是一种广泛使用的开源Java分布式缓存.主要面向通用缓存,Java EE和轻量级容器.它具有内存和磁盘存储,缓存加载器,缓存扩展,缓存异常处理程序,一个gzip缓存servlet过滤器,支持REST和SOAP api等特点. 2 Spring Boot整合EhCache步骤 2.

Spring mvc整合mybatis基于mysql数据库实现用户增删改查及其分页显示的完整入门实例【转】

Spring mvc整合mybatis例子, 基于mysql数据库实现对用户的增.删.改.查,及分页显示的完整例子. 查询显示用户 添加用户 更新用户 官方验证: 项目截图 必须修改applicationContext.xml中mysql的配置为本地的,否则启动失败. 另外jar包多一个ehcache.jar无关紧要,删除即可. 1. 使用阿里巴巴Druid连接池(高效.功能强大.可扩展性好的数据库连接池.监控数据库访问性能.支持Common-Logging.Log4j和JdkLog,监控数据库

Spring+EhCache缓存实例(详细讲解+源码下载)(转)

一.ehcahe的介绍 EhCache 是一个纯Java的进程内缓存框架,具有快速.精干等特点,是Hibernate中默认的CacheProvider.Ehcache是一种广泛使用的开源Java分布式缓存.主要面向通用缓存,Java EE和轻量级容器.它具有内存和磁盘存储,缓存加载器,缓存扩展,缓存异常处理程序,一个gzip缓存servlet过滤器,支持REST和SOAP api等特点. 优点: 1. 快速 2. 简单 3. 多种缓存策略 4. 缓存数据有两级:内存和磁盘,因此无需担心容量问题 

Spring+EhCache缓存实例

一.ehcahe的介绍 EhCache 是一个纯Java的进程内缓存框架,具有快速.精干等特点,是Hibernate中默认的CacheProvider.Ehcache是一种广泛使用的开源Java分布式缓存.主要面向通用缓存,Java EE和轻量级容器.它具有内存和磁盘存储,缓存加载器,缓存扩展,缓存异常处理程序,一个gzip缓存servlet过滤器,支持REST和SOAP api等特点. 优点:1. 快速2. 简单3. 多种缓存策略4. 缓存数据有两级:内存和磁盘,因此无需担心容量问题5. 缓存

Spring+EhCache缓存实例(详细讲解+源码下载)

一.ehcahe的介绍 EhCache 是一个纯Java的进程内缓存框架,具有快速.精干等特点,是Hibernate中默认的CacheProvider.Ehcache是一种广泛使用的开源Java分布式缓存.主要面向通用缓存,Java EE和轻量级容器.它具有内存和磁盘存储,缓存加载器,缓存扩展,缓存异常处理程序,一个gzip缓存servlet过滤器,支持REST和SOAP api等特点. 优点: 1. 快速 2. 简单 3. 多种缓存策略 4. 缓存数据有两级:内存和磁盘,因此无需担心容量问题

Mybatis框架学习(四)—查询缓存与spring的整合开发

1       项目整体目录 2       查询缓存 2.1     缓存的意义 将用户经常查询的数据放在缓存(内存)中,用户去查询数据就不用从磁盘上(关系型数据库数据文件)查询,从缓存中查询,从而提高查询效率,解决了高并发系统的性能问题. 2.1    mybatis持久层缓存 mybatis提供一级缓存和二级缓存 mybatis一级缓存是一个SqlSession级别,sqlsession只能访问自己的一级缓存的数据,二级缓存是跨sqlSession,是mapper级别的缓存,对于mappe

mybatis 与 ehcache 整合[转]

1.简介 MyBatis 是支持普通SQL 查询,存储过程和高级映射的优秀持久层框架.MyBatis 消除了几乎所有的JDBC 代码和参数的手工设置以及结果集的检索. Ehcache 是现在最流行的纯Java开源缓存框架,配置简单.结构清晰.功能强大,最初知道它,是从Hibernate的缓存开始的. 2. 准备工作 下载mybatis相关包与ehcache相关包 ehcache-core-2.4.4.jar mybatis-ehcache-1.0.0.jar slf4j-api-1.6.1.ja