- 浏览: 102026 次
- 性别:
- 来自: 深圳
最新评论
-
shuhai42:
曙海嵌入式学院提供以下课程的培训--中国最大的FPGA,DSP ...
敏捷开发之路,未来软件开发的变革? -
kaki:
建议吸收大家意见,打包下载吧。
泛型dao架构实现,封装crud等基本操作 -
xuhbiao:
不错,学习了。。
泛型dao架构实现,封装crud等基本操作 -
danjp:
LZ
单从你DAO的借口定制来说,我觉得不是太好,特别是更新方 ...
泛型dao架构实现,封装crud等基本操作 -
danjp:
jeff312 写道mfdkydyw4 写道EXvision ...
泛型dao架构实现,封装crud等基本操作
cache服务的实现(在spring中)
扩展Spring:实现Cache服务- -
TargetSource的概念
Spring Framework引入了TargetSource的概念,使用org.springframework.aop.TargetSource接口来表示。它负责返回实现了JointPoint的"target object"。当AOP proxy处理一个方法调用时,TargetSource的实现返回target对象的实例。
使用Spring AOP的开发人员通常并不需要直接和TargetSource打交道,但TargetSource提供了支持pooling,hot swappable等高级特性。例如,pooling TargetSource使用一个pool管理对象实例,为每次调用返回不同的target实例。
如果你不指定TargetSource,Spring AOP将使用一个缺省的实现来包装对象,并且每次调用都会返回同一个对象实例。
我的目标
Spring Framework使用TargetSource的概念实现了pooling的功能,其中使用了Jakarta的Commons Pool。通过编写配置文件声明,Spring可以pooling任何一个POJO对象。我的目标是模仿pooling的实现方式,实现一个简单的缓存机制。用于探索Spring AOP的实现方式,以便扩展目前Spring Framework没有实现的功能。
选择对象缓存类库
目前,开源的对象缓存类库有很多,如Jakarta Commons Cache,OSCache,Java Caching System和Java Object Cache等。其中OSCache的比较成熟,应用较广(如Hibernate,iBatis等),功能也很强大(支持Cluster)。因此,我选择了OSCache作为实现Cache TargetSource的类库。
准备测试用例
考虑一下这样的应用情景,我的应用需要一个管理数据的对象,该对象每隔一定的时间从数据库中读取数据,并缓存在内存中。在缓存期间,如果客户程序读取数据,该数据对象将返回内存中的数据,如果数据超过指定的缓存时间,则重新从数据库中读取并更新数据。
首先,我模仿CommonsPoolTargetSource编写了以下的testcache.xml配置文件:
<beans>
<bean id="businessObjectTarget" class="unittest.MyBusinessObject" singleton="false"/>
<bean id="cacheTargetSource" class="unittest.OSCacheTargetSource">
<property name="target"><ref local="businessObjectTarget"/></property>
<property name="refreshPeriod"><value>10</value></property>
</bean>
<bean id="businessObject" class="org.springframework.aop.framework.ProxyFactoryBean">
<property name="proxyInterfaces"><value>unittest.Business</value></property>
<property name="targetSource"><ref local="cacheTargetSource"/></property>
</bean>
</beans>
然后,编写测试用例CacheTargetSourceTest:
public class CacheTargetSourceTest extends TestCase {
ApplicationContext ctx = null;
BizManager manager;
protected void setUp() throws Exception {
super.setUp();
ctx = new FileSystemXmlApplicationContext("testcache.xml");
manager = new BizManager(200);
manager.start();
}
public void testGetId() throws Exception {
for (int i=0; i<6; i++) {
Thread.sleep(2000);
Business biz = (Business)ctx.getBean("businessObject");
assertNotNull(biz);
System.out.println("get id from BizObjec=" + biz.getId());
}
}
}
接下来,编写业务测试代码Business,MyBusinessObject:
public interface Business {
public int getId();
}
public class MyBusinessObject implements Business {
final Log logger = LogFactory.getLog(this.getClass());
private int id = 0;
public MyBusinessObject() {
logger.debug("create new MyBusnissObject");
id = BizManager.getId();
}
public int getId() {
return id;
}
}
其中MyBusinessObject通过一个BizManager线程类来更新数据库,模拟数据库中的数据更新。
public class BizManager extends Thread {
private int period = 1000;
private static int id = 0;
public BizManager(int l) {
this.period = l;
}
public void run() {
System.out.println("BizManager started.");
try {
while (true) {
sleep(period);
id++;
}
} catch(Exception ex) {}
}
public static int getId() {
return id;
}
}
最后,实现一个简单OSCacheTargetSource类。我在这里试探性地实现了TargetSource接口,并通过setRefreshPeriod方法指定了更新数据的时间间隔。在这里有一些地方需要说明。为了能让FactoryBean生成新的TargetSource实例,TargetSource的isStatic方法返回false;在releaseTarget方法中调用CacheAdministrator的destroy方法;每次更新内存的数据时,都生成新的数据管理对象,以调用构造器中读取更新数据的方法,这种做法当然很不优雅,留待以后重构。代码如下:
public class OSCacheTargetSource implements TargetSource {
private int refreshPeriod = 2000;
private Object target;
private final static String MY_KEY = "mykey";
private GeneralCacheAdministrator admin;
private final Log logger = LogFactory.getLog(OSCacheTargetSource.class);
public OSCacheTargetSource() {
admin = new GeneralCacheAdministrator();
}
public boolean isStatic() {
return false;
}
public void setTarget(Object obj) {
this.target = obj;
}
public void releaseTarget(Object target) throws Exception {
admin.destroy();
}
public int getRefreshPeriod() {
return refreshPeriod;
}
public void setRefreshPeriod(int i) {
refreshPeriod = i;
}
private Object getCached() {
try {
//CacheEntry.INDEFINITE_EXPIRY = -1
target = (Object) admin.getFromCache(MY_KEY, refreshPeriod);
} catch (NeedsRefreshException nre) {
try {
target = target.getClass().newInstance();
admin.putInCache(MY_KEY, target);
} catch (Exception ex) {
target = nre.getCacheContent();
admin.cancelUpdate(MY_KEY);
}
}
return target;
}
public Object getTarget() throws Exception {
return getCached();
}
发表评论
-
ExtJs+struts+spring+mybatis通用管理后台程序框架
2015-01-20 10:08 1269花了一段时间学习Extjs,总算学有所成,并在项目中有成 ... -
Oracle JOB问题解决汇总
2009-05-23 22:58 3752一。job的运行频率设置 1.每天固定时间运行,比如早 ... -
PostInsertEventListener 插入发生死循环问题
2009-01-15 11:18 2186package com.easou.ad.listener; ... -
怎么让文章自动适应表格
2009-01-09 23:24 936style="word-break:brea ... -
敏捷开发之路,未来软件开发的变革?
2008-12-27 19:51 3568敏捷开发这个名词已经不是第一次听到了,大家都推崇它好,就算是华 ... -
memcached使用与优化
2008-12-26 13:01 166601、客户端在与 memcached 服务建立连接之后,进行存取 ... -
spring hibernate 事务配置 2
2008-11-27 00:13 1223<bean id="txProxyTempl ... -
spring hibernate 事务配置
2008-11-27 00:07 1454<!--事务拦截器,激活事务管理器所必须的bean ... -
我也SHOW下JDBC底层操作工具类
2008-11-10 11:15 3425/* * JDBCUtil.java * * ... -
泛型dao架构实现,封装crud等基本操作
2008-11-10 11:07 4390今天闲着没事,根据公司 ... -
项目沟通7个好习惯
2008-11-07 13:17 911写道 简介 项目沟通7个好习惯 习惯一:态度积极 习惯二:牢记 ... -
webwork+hibernate+spring项目源代码自动生成(附源代码)
2008-11-05 22:39 1551自己写了一个自动生成源代码的工具,代码自动生成,以及一个完整项 ... -
eclipse快捷键大全
2008-11-02 20:58 8801. 常用快捷键 (1)Ctrl+Space 说明:内 ... -
一个js写的StringBuffer类
2008-11-02 11:15 1375function StringBuffer() { this ... -
Spring jdbc 操作实例
2008-11-02 11:09 3200package com.szxhdz.dao; import ... -
oracle分页
2008-11-02 11:07 950从taba中获取第1到10条记录 select * fro ... -
转载40种网页常用小技巧(javascript)--备不时之需
2008-11-01 18:16 977• 转载40种网页常用小技巧(javascript)--备不时 ... -
webwork和spring整合
2008-11-01 18:11 1319始终没有搞明白在appfuse中是通过什么方式将webwork ... -
Struts标记库
2008-11-01 18:10 951Struts标记库JSP视窗组件 ... -
springIOC
2008-11-01 18:07 942首先想说说IoC(Inversion ...
相关推荐
描述中提到的"springmodules-ehcache.xsd"和"springmodules-cache.xsd"可能来自于Spring Modules项目,这是一个早期的扩展Spring功能的库,其中包含了对Ehcache的支持。这两个文件定义了XML元素和属性,使得开发者...
Spring Cache是一个抽象层,它允许开发者在不关注具体缓存实现的情况下,轻松地在应用程序中添加缓存功能。本篇文章将详细探讨如何通过key值更新Spring Cache中的指定缓存,以及相关的缓存管理策略。 首先,让我们...
本文将详细介绍如何利用Spring框架结合ehCache实现一个简单的缓存解决方案。 #### 二、Spring缓存管理 Spring框架提供了多种方式来管理和操作缓存,包括基于注解的缓存管理、基于XML配置的缓存管理等。本文将重点...
SpringCache是一个基于AOP(Aspect-Oriented Programming)的缓存解决方案,可以自动地为我们实现缓存功能,从而减少了编写模板代码的工作量。 使用SpringCache,我们可以轻松地将缓存功能添加到我们的应用程序中。...
Spring Cache是Spring框架提供的一种抽象层,允许开发者轻松地在应用程序中引入缓存机制,而无需关心具体的缓存实现。本项目"spring-cache-mongodb"正是一个针对Spring Cache的实现,它利用MongoDB作为底层的存储...
在Spring Boot应用中,Spring Cache是一个强大的工具,用于在应用程序中实现缓存抽象,它可以减少对数据库或远程服务的重复调用,从而提高性能。在本篇文档中,我们将探讨如何使用Spring Cache来缓存数据,并结合...
在`demo_cache2_springcache_redis_mybatis_maven_springboot_lombok`这个项目中,除了上述的Spring Cache和Redis的整合,还可能包含了MyBatis的集成,MyBatis是一个持久层框架,用于处理SQL语句。Lombok是一个代码...
在本项目中,我们主要探讨的是如何将Spring Cache与memcached...通过这样的整合,我们可以充分利用Spring Cache的便捷性和memcached的高性能,为应用程序构建一个强大的缓存层,有效提升服务的响应速度和并发处理能力。
在SSM框架中引入Memcached并基于Spring的Cache注解进行整合,可以实现高效、分布式的数据缓存,提升系统性能。下面将详细阐述这一过程中的关键知识点。 1. **Memcached介绍**: Memcached是一款高性能、分布式的...
为了实现一级缓存,可以在服务层添加一个本地缓存,如使用`@Cacheable`注解的方法前先检查本地缓存。如果本地缓存存在,则直接返回,否则查询远程Redis并存入本地缓存。 二级缓存的实现则是在一级缓存失效后,自动...
**Redis整合SpringCache实例** 在现代的Web应用中,数据缓存是提高系统性能的关键技术之一。本示例主要探讨如何将开源的内存数据结构存储系统Redis与Spring Cache框架结合,实现高效的分布式缓存解决方案。Redis以...
而Spring Modules Cache是Spring框架的一个扩展,它提供了一种统一的缓存管理机制,使得开发者能够方便地在Spring应用中集成各种缓存解决方案,如 EhCache、JCS、GemFire等。本文将深入探讨Spring Modules Cache在...
Spring Cache 是 Spring 框架的一个重要组成部分,它提供了一种在应用程序中统一管理缓存的能力,无需依赖特定的缓存实现,如 Ehcache、Redis 或 Hibernate 二级缓存等。通过 Spring Cache,开发者可以方便地在方法...
标题中的"spring-cache-4.2.xsd.zip"是一个压缩包文件,主要包含了Spring框架缓存模块的相关XML Schema定义文件。...通过合理配置,开发者可以利用Spring Cache实现高效且灵活的缓存管理,优化应用程序的性能。
Spring Cache 是 Spring 3.1 版本引入的一项重要特性,它不是一种具体的缓存实现(如 EHCache 或 OSCache),而是一种缓存使用的抽象层。通过在现有的业务代码上添加特定的注解,可以轻松地为方法调用添加缓存支持。...
此外,还需要掌握如何将Spring Cache与Redis整合,以便在应用中高效使用缓存机制。 一、Redis的主从配置 1. 准备工作: - 操作系统要求:Ubuntu 16.04。 - Redis版本:选择适合的稳定版本,例如redis-4.0.9.tar....
Spring 是一个广泛使用的 Java 应用框架,提供了一系列的开发工具和服务,包括依赖注入、面向切面编程以及数据访问等。在企业级应用中,Spring 提供的缓存抽象使得集成各种缓存系统变得简单,其中包括 Redis。 集成...
在Spring Boot+Spring Cache实现两级缓存(Redis+Caffeine)中,Redis作为远程缓存,Caffeine作为应用内缓存。当应用内缓存有符合条件的数据时,就可以直接使用,而不用通过网络到Redis中去获取,这样就形成了两级...
使用springCache实现缓存