`

面向AOP编程 二 cache结合

    博客分类:
  • java
 
阅读更多

缓存配置 ehcache.xml

<?xml version="1.0" encoding="UTF-8"?>
<ehcache>
    <!-- 此处的路径可以自行定义,eg:“c://myapp//cache” ,即是自行定义的 
   <diskStore path="c://myapp//cache" />-->
    <!-- 而这个“java.io.tmpdir”则是window环境下的tmp ,寻找环境变量下的路
    径方式:System.out.println(System.getProperty("java.io.tmpdir"));-->
    <diskStore path="java.io.tmpdir" />

    <defaultCache
        maxElementsInMemory="10000"
        eternal="false"
        timeToIdleSeconds="12000"
        timeToLiveSeconds="12000"
        overflowToDisk="true"
        diskPersistent="false"
        diskExpiryThreadIntervalSeconds="120"
        memoryStoreEvictionPolicy="LRU"
    />

<!-- maxElementsOnDisk="100000"  最大的磁盘存储数    而如果保持到缓存中的数据,超过了内存
缓存的最大数据,写入了一部分到磁盘中,此处的配置值不够大的话,就会导致取内存缓存中的
的数据时抛异常     -->
   <cache name="logBean"
        maxElementsInMemory="100"
        eternal="false"
        maxElementsOnDisk="100000000"      
        overflowToDisk="true"
        timeToIdleSeconds="3600"
        timeToLiveSeconds="3600"
        memoryStoreEvictionPolicy="LFU"
    />
    <cache name="logBean2"
        maxElementsInMemory="100"
        eternal="false"
        maxElementsOnDisk="100000000"      
        overflowToDisk="true"
        timeToIdleSeconds="3600"
        timeToLiveSeconds="3600"
        memoryStoreEvictionPolicy="LFU"
    />
</ehcache>

 
实现部分
一、初始化 cache

private static CacheManager manager;
static {
    init();
}
private static void init() {
    String rootPath = ClassLoader.getSystemResource("").toString();
    rootPath = rootPath.substring(5, rootPath.length());
    String fileName = rootPath + "ehcache.xml";
    manager = new CacheManager(fileName);// 引入写好的ehcache配置文件
}

 
二、 测试 aop 和 cache结合

public static void main(String[] args) {
    String time3 = DateUtil.getNowTimeStr("yyyy-MM-dd hh:mm:ss.sss");
    for (int i = 0; i < 10000000; i++) {
        testJDKcache();
    }
    String time4 = DateUtil.getNowTimeStr("yyyy-MM-dd hh:mm:ss.sss");
    for (int i = 0; i < 10000000; i++) {
         testCGLIBcache();
     }
    String time5 = DateUtil.getNowTimeStr("yyyy-MM-dd hh:mm:ss.sss");
}


public static void testJDKcache() {
    Cache cache = manager.getCache("logBean");
    IBusiness2 proxyBusiness;
    Element e = cache.get("testJDKcache");
    if (e == null) {
        // 需要代理的接口,被代理类实现的多个接口都必须在这里定义
        Class[] proxyInterface = new Class[] { IBusiness.class,
        IBusiness2.class };

        // 构建AOP的Advice,这里需要歘如业务的实例
        LogInvocationHandler handler = new LogInvocationHandler(new Business());

        // 生成代理类的字节码加载器
        ClassLoader classLoader = LogInvocationHandler.class.getClassLoader();

        // 织入器,织入代码并生成代理类
        proxyBusiness = (IBusiness2) Proxy.newProxyInstance(
        classLoader, proxyInterface, handler);

        Element element = new Element("testJDKcache", proxyBusiness);
        cache.put(element);
        cache.flush();// 将缓存中的数据写入磁盘中,但是只有在超出配置的最大内存缓存值时,
                       //才会执行此操作,此处测试为100000才执行
    } else {
        proxyBusiness = (IBusiness2)e.getValue();
    }

    //使用代理类的实例调用方法
    proxyBusiness.doSomeThing2();
    ((IBusiness)proxyBusiness).doSomeThing();
}

public static void testCGLIBcache(){
    Cache cache = manager.getCache("logBean2");
    IBusiness2 newBusiness;
    Element e = cache.get("testCGLIBcache");
    if (e == null) {
        //创建一个织入器
        Enhancer enhancer = new Enhancer();
        //设置父类
        enhancer.setSuperclass(Business.class);
        //设置需要织入的逻辑
        enhancer.setCallback(new LogIntercept());
        //使用织入器创建子类
        newBusiness = (IBusiness2)enhancer.create();
        Element element = new Element("testCGLIBcache", newBusiness);
        cache.put(element);
        cache.flush();// 将缓存中的数据写入磁盘中,但是只有在超出配置的最大内存缓存值时,
	              //才会执行此操作,此处测试为100000才执行
    } else {
        newBusiness = (IBusiness2)e.getValue();
    }
    
    newBusiness.doSomeThing2();
    ((IBusiness)newBusiness).doSomeThing();
}

 


三、测试结果
testJDKcache:6000
testCGLIBcache:4000

 

四、问题

1。  Cache cache = manager.getCache("logBean2"); 需要配置两个 不能一个对多个对象,有待找原因

        2。  IBusiness 接口实现 extends Serializable 在cglib中可以提升很高

 

0
0
分享到:
评论

相关推荐

    AOP Cache源代码

    在IT行业中,Spring AOP(面向切面编程)和Ehcache是两个非常重要的概念,它们经常被结合在一起用于实现高效的应用程序缓存系统。在这个"AOP Cache源代码"项目中,我们可以看到如何利用这两者来提升应用性能。下面将...

    实战项目-AOP-cache

    在本实战项目"AOP-cache"中,我们将深入探讨如何利用面向切面编程(AOP)和Ehcache技术来实现高效的数据缓存处理。面向切面编程是一种编程范式,它允许开发者将关注点分离,比如日志、事务管理、性能监控等,从主...

    spring aop 自定义缓存实现

    在Spring AOP(面向切面编程)中,自定义缓存是一种常见的优化技术,它可以显著提高应用程序的性能,减少对数据库或远程服务的重复访问。本实例将介绍如何利用Spring AOP来实现自定义缓存功能。 首先,理解Spring ...

    .NET对象查找服务和AOP开发框架:Fohu.Core2.0

    **AOP(面向切面编程)** 面向切面编程是一种编程范式,旨在提高软件的模块化程度,通过分离关注点来改善代码结构。在.NET中,AOP常用于处理如日志记录、事务管理、性能监控等横切关注点,这些关注点在多个类和方法...

    SpringAOP结合ehCache实现简单缓存实例

    在IT行业中,Spring AOP(面向切面编程)和EhCache是两个非常重要的概念,它们在提升应用程序性能和管理缓存方面发挥着关键作用。本文将深入探讨如何结合Spring AOP与EhCache实现一个简单的缓存实例,以便优化Java...

    aop例子aop例子

    在IT行业中,面向切面编程(Aspect Oriented Programming,AOP)是一种强大的设计模式,它允许程序员将关注点从核心业务逻辑中分离出来,比如日志记录、事务管理、性能监控等。本例子是一个关于如何在Spring框架中...

    Spring AOP+ehCache简单缓存系统解决方案

    在IT行业中,Spring AOP(面向切面编程)和ehCache是两个重要的工具,它们在构建高效、可扩展的应用程序时发挥着关键作用。本文将深入探讨如何利用这两个技术实现一个简单的缓存系统解决方案。 首先,Spring AOP是...

    开源框架spring详解-----AOP的深刻理解

    标题 "开源框架spring详解-----AOP的深刻理解" 指向的是对Spring框架中核心概念之一的面向切面编程(Aspect Oriented Programming, AOP)的深入探讨。AOP是Spring用来解决横切关注点问题的一种编程模式,它允许...

    SpringAOP之探秘(动态代理、责任链模式、注解使用)

    在IT行业中,Spring AOP(面向切面编程)是一个重要的概念,它允许程序员定义横切关注点,并将这些关注点与业务逻辑分离。本篇文章将深入探讨Spring AOP中的动态代理、责任链模式以及注解的使用。 首先,动态代理是...

    Spring中AOP实现EHCache的整合中采用SpringModule结合(二)

    在Spring框架中,AOP(面向切面编程)是一种强大的工具,它允许我们在不修改代码的情况下,对应用程序的特定部分进行增强或拦截。在大型企业级应用中,缓存管理是提高性能的关键因素之一,而EHCache是一款广泛使用的...

    SpringBoot AOP各种注解、自定义注解、鉴权使用案例(免费下载)

    SpringBoot AOP,即面向切面编程,是Spring框架中的一个重要特性,用于实现代码的横切关注点,如日志记录、事务管理、权限验证等。AOP通过使用代理模式,将这些关注点与核心业务逻辑分离,使得代码更加模块化,更...

    spring_mem_plugin:Spring的缓存插件,使用annotation方式和spring的aop编程让缓存业务更加方便和解耦,主要面向memcached

    顾名思义是基于spring和memcached的一个插件,该插件目前实现了memcached的查询缓存,利用java的annotation方式和spring的AOP切面编程使得我们在业务层获得缓存数据非常的方便 ##开始使用 首先你必须实现CacheSupport...

    使用jboss cache 作为pojo cache

    在实际应用中,JBoss Cache通过其JBossCacheAop组件提供POJO缓存功能,允许开发者利用面向切面编程(AOP)来简化缓存操作,而无需直接修改业务逻辑代码。通过案例分析,我们可以更深入地理解如何在分布式环境中利用...

    利用MemoryCache和AOP进行昂贵的呼叫

    "利用MemoryCache和AOP进行昂贵的呼叫"这个主题聚焦于两种技术:System.Runtime.Caching.MemoryCache和面向切面编程(AOP)。这两种技术结合使用,可以有效地缓存计算昂贵或数据库查询结果,避免重复执行这些操作,...

    帮swoft2实现一个aop非侵入式的缓存方式

    Swoft2提供了强大的AOP(面向切面编程)功能,允许开发者通过定义切面来实现代码的解耦和复用。在这个场景中,我们将探讨如何在Swoft2中实现一个非侵入式的缓存策略,使得缓存功能可以无缝地融入到现有的业务逻辑中...

    AutoLoadCache是基于AOPAnnotation等技术实现的高效的缓存管理解决方案

    AutoLoadCache是一个强大的Java缓存管理工具,它利用AOP(面向切面编程)和注解技术来提供高效且灵活的缓存策略。在高并发的Web应用中,缓存管理是性能优化的关键部分,而AutoLoadCache正是为了解决这个问题而设计的...

    springCache

    在实际应用中,Spring Cache 还可以与其他 Spring 模块,如 AOP(面向切面编程)和 Transaction(事务管理)结合使用,实现更复杂的缓存策略。例如,可以利用 AOP 来实现缓存失效策略,如基于时间的过期、基于引用...

    Redis整合SpringCache实例

    Spring Cache基于AOP(面向切面编程)提供了一个通用的缓存抽象层,它允许开发者在不修改代码的情况下,通过注解方式实现缓存的添加和管理。Spring Cache支持多种缓存提供商,包括Redis、 Ehcache、Gemfire等。在本...

    基于AOP的智能web缓存框架.pdf

    为此,邓磊等人提出了一种基于面向方面编程(Aspect-Oriented Programming, AOP)技术的智能Web缓存框架——ABWC(AOP-Based Web Cache),旨在解决现有缓存技术中存在的问题,提高Web应用系统的整体性能。...

Global site tag (gtag.js) - Google Analytics