- 浏览: 102027 次
- 性别:
- 来自: 深圳
最新评论
-
shuhai42:
曙海嵌入式学院提供以下课程的培训--中国最大的FPGA,DSP ...
敏捷开发之路,未来软件开发的变革? -
kaki:
建议吸收大家意见,打包下载吧。
泛型dao架构实现,封装crud等基本操作 -
xuhbiao:
不错,学习了。。
泛型dao架构实现,封装crud等基本操作 -
danjp:
LZ
单从你DAO的借口定制来说,我觉得不是太好,特别是更新方 ...
泛型dao架构实现,封装crud等基本操作 -
danjp:
jeff312 写道mfdkydyw4 写道EXvision ...
泛型dao架构实现,封装crud等基本操作
public Class getTargetClass() {
try {
return this.getTarget().getClass();
} catch (Exception e) {
return null;
}
}
}
现在,我们运行测试用例。测试状态条中出现绿条,测试通过。注意,我们在testcache.xml定义的更新数据的间隔是10秒;测试代码每隔2秒读取一次数据;因此我们预计前5次读取的数据是相同的。让我们观察Console窗口中DEBUG信息():
......
BizManager started.
......
27,781 DEBUG unittest.MyBusinessObject - create new MyBusnissObject
......
get id from BizObjec=9
get id from BizObjec=9
get id from BizObjec=9
get id from BizObjec=9
get id from BizObjec=9
37,796 DEBUG unittest.MyBusinessObject - create new MyBusnissObject
get id from BizObjec=59
果然如此,前5次变量id的值都是9,读取第6次数据时,时间已经过12秒,此时变量id的值是59。现在我们将refreshPeriod的值改为5秒,DEBUG信息如下:
BizManager started.
......
get id from BizObjec=9
get id from BizObjec=9
get id from BizObjec=9
03,921 DEBUG unittest.MyBusinessObject - create new MyBusnissObject
get id from BizObjec=39
get id from BizObjec=39
get id from BizObjec=39
重构OSCacheTargetSource
首先定义Cachable接口如下:
public interface Cachable {
public void refresh();
public void close();
}
然后,让MyBusinessObject实现Cachable接口,refresh方法如下:
public void refresh() {
logger.debug("refresh MyBusnissObject");
id = BizManager.getId();
}
接下来,修改OSCacheTargetSource类的getCached方法如下,其中屏蔽的是先前的实现代码:
private Object getCached() {
try {
//CacheEntry.INDEFINITE_EXPIRY = -1
target = (Object) admin.getFromCache(MY_KEY, refreshPeriod);
} catch (NeedsRefreshException nre) {
try {
//target = target.getClass().newInstance();
((Cachable)target).refresh();
admin.putInCache(MY_KEY, target);
} catch (Exception ex) {
target = nre.getCacheContent();
admin.cancelUpdate(MY_KEY);
}
}
return target;
}
最后,运行测试用例,出现了绿条,测试通过。下面是DEBUG信息输出:
BizManager started.
......
47,828 DEBUG base.Cache - No cache entry exists for key='mykey', creating
47,828 DEBUG unittest.MyBusinessObject - refresh MyBusnissObject
......
get id from BizObjec=9
get id from BizObjec=9
get id from BizObjec=9
53,843 DEBUG unittest.MyBusinessObject - refresh MyBusnissObject
get id from BizObjec=39
get id from BizObjec=39
get id from BizObjec=39
我们的方案看来起作用了,但仍然让我们感觉不好,因为需要缓存服务的对象必须要实现Cachable接口,而且OSCacheTargetSource假设需要缓存的对象必须拥有缺省的构造器,这种解决方案太具有侵入性,违反了Spring Framework的设计思想。为了重构代码,OSCacheTargetSource对象必须获得需要缓存的Bean的信息。因此,OSCacheTargetSource对象必须实现BeanFactoryAware或ApplicationContextAware接口。为了证实我们的思路,参考CommonsPoolTargetSource的源代码,发现它确实是实现了BeanFactoryAware接口。
基于以上的分析,我们把OSCacheTargetSource重构为:
public class OSCacheTargetSource implements TargetSource, BeanFactoryAware {
…
public void setTargetBeanName(String beanName) {
this.targetBeanName = beanName;
}
private Object getCached() {
try {
target = (Object) admin.getFromCache(MY_KEY, refreshPeriod);
} catch (NeedsRefreshException nre) {
try {
target = beanFactory.getBean(this.targetBeanName);
admin.putInCache(MY_KEY, target);
} catch (Exception ex) {
target = nre.getCacheContent();
admin.cancelUpdate(MY_KEY);
}
}
return target;
}
}
将MyBusinessObject重构为:
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;
}
public void close() {}
}
并修改testcache.xml配置文件如下:
<beans>
<bean id="businessObjectTarget" class="unittest.MyBusinessObject" singleton="false" destroy-method="close"/>
<bean id="cacheTargetSource" class="unittest.OSCacheTargetSource">
<property name="targetBeanName"><value>businessObjectTarget</value></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>
现在,我们运行测试用例。测试状态条中出现绿条,测试通过。但注意到OSCacheTargetSource类中缓存的对象的key值仍然是写死的,我们需要一个这样的key值,对于BeanFactory或ApplicationContext必须是唯一的。因为每个Bean的id值正好符合这个条件,我们可以使用targetBeanName作为key值。因此OSCacheTargetSource类修改为:
private Object getCached() {
try {
target = (Object) admin.getFromCache(
this.targetBeanName, refreshPeriod);
} catch (NeedsRefreshException nre) {
try {
target = beanFactory.getBean(this.targetBeanName);
admin.putInCache(this.targetBeanName, target);
} catch (Exception ex) {
target = nre.getCacheContent();
admin.cancelUpdate(this.targetBeanName);
}
}
return target;
}
发表评论
-
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 ...
相关推荐
标题中的"spring-cache.xsd+spring-encache.xsd"提到了两个XML Schema定义文件,它们是Spring框架中用于缓存管理的配置规范。Spring框架是一个广泛应用的Java企业级应用开发框架,它提供了多种功能,包括但不限于...
Spring Cache是一个抽象层,它允许开发者在不关注具体缓存实现的情况下,轻松地在应用程序中添加缓存功能。本篇文章将详细探讨如何通过key值更新Spring Cache中的指定缓存,以及相关的缓存管理策略。 首先,让我们...
Spring Cache是Spring框架提供的一种抽象层,允许开发者轻松地在应用程序中引入缓存机制,而无需关心具体的缓存实现。本项目"spring-cache-mongodb"正是一个针对Spring Cache的实现,它利用MongoDB作为底层的存储...
在Spring Boot应用中,Spring Cache是一个强大的工具,用于在应用程序中实现缓存抽象,它可以减少对数据库或远程服务的重复调用,从而提高性能。在本篇文档中,我们将探讨如何使用Spring Cache来缓存数据,并结合...
在本文中,我们将对SpringCache与Redis集成的优雅缓存解决方案进行详细介绍。 缓存是加速服务响应速度的一种非常有效并且简单的方式。在缓存领域,有很多知名的框架,如EhCache、Guava、HazelCast等。Redis作为key-...
本篇文章将探讨如何扩展Spring Boot的缓存功能,实现基于Redis的一级和二级分布式缓存。Redis是一个高性能的键值存储系统,常用于实现分布式缓存。 一级缓存通常指的是应用程序内部的缓存,如Spring Cache或Guava ...
### Spring实现Cache简单解决方案 #### 一、背景与概述 在现代软件开发中,缓存是一种常见的优化手段,用于提高应用程序的性能。Spring框架作为Java领域最流行的开发框架之一,为开发者提供了丰富的缓存管理机制。...
在这个项目中,"springcache+redis"的整合意味着我们要利用Spring Cache的特性,将缓存存储在Redis中,以提升应用的性能。 首先,Spring Cache提供了`@Cacheable`、`@CacheEvict`和`@Caching`等注解,允许我们在...
在本项目中,我们主要探讨的是如何将Spring Cache与memcached...通过这样的整合,我们可以充分利用Spring Cache的便捷性和memcached的高性能,为应用程序构建一个强大的缓存层,有效提升服务的响应速度和并发处理能力。
在SSM框架中引入Memcached并基于Spring的Cache注解进行整合,可以实现高效、分布式的数据缓存,提升系统性能。下面将详细阐述这一过程中的关键知识点。 1. **Memcached介绍**: Memcached是一款高性能、分布式的...
**Redis整合SpringCache实例** 在现代的Web应用中,数据缓存是提高系统性能的关键技术之一。本示例主要探讨如何将开源的内存数据结构存储系统Redis与Spring Cache框架结合,实现高效的分布式缓存解决方案。Redis以...
在Spring Boot+Spring Cache实现两级缓存(Redis+Caffeine)中,Redis作为远程缓存,Caffeine作为应用内缓存。当应用内缓存有符合条件的数据时,就可以直接使用,而不用通过网络到Redis中去获取,这样就形成了两级...
标题中的"spring-cache-4.2.xsd.zip"是一个压缩包文件,主要包含了Spring框架缓存模块的相关XML Schema定义文件。...通过合理配置,开发者可以利用Spring Cache实现高效且灵活的缓存管理,优化应用程序的性能。
Spring Cache 是 Spring 框架的一个重要组成部分,它提供了一种在应用程序中统一管理缓存的能力,无需依赖特定的缓存实现,如 Ehcache、Redis 或 Hibernate 二级缓存等。通过 Spring Cache,开发者可以方便地在方法...
本文将深入探讨Spring Modules Cache在jar包`spring-modules-cache.jar`中的核心概念和实现方式。 首先,`spring-modules-cache.jar`这个jar包是Spring Modules项目的一部分,该项目旨在为Spring框架提供一系列的...
此外,还需要掌握如何将Spring Cache与Redis整合,以便在应用中高效使用缓存机制。 一、Redis的主从配置 1. 准备工作: - 操作系统要求:Ubuntu 16.04。 - Redis版本:选择适合的稳定版本,例如redis-4.0.9.tar....
#### 二、Spring Cache的基本使用 ##### 2.1 自定义缓存示例分析 在使用 Spring Cache 之前,通常我们需要自己实现缓存逻辑。下面是一个简单的自定义缓存管理器实现示例: 1. **实体类 Account**:表示账户信息,...
使用springCache实现缓存
**二、Spring Cache** Spring Cache 是 Spring 框架的一部分,它提供了一种抽象的缓存支持,可以应用于任何缓存系统,包括 Redis。要启用 Spring Cache,你需要在配置类中声明 `@EnableCaching` 注解,并配置缓存...