- 浏览: 100114 次
- 性别:
- 来自: 深圳
最新评论
-
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 1221花了一段时间学习Extjs,总算学有所成,并在项目中有成 ... -
Oracle JOB问题解决汇总
2009-05-23 22:58 3711一。job的运行频率设置 1.每天固定时间运行,比如早 ... -
PostInsertEventListener 插入发生死循环问题
2009-01-15 11:18 2146package com.easou.ad.listener; ... -
怎么让文章自动适应表格
2009-01-09 23:24 898style="word-break:brea ... -
敏捷开发之路,未来软件开发的变革?
2008-12-27 19:51 3532敏捷开发这个名词已经不是第一次听到了,大家都推崇它好,就算是华 ... -
memcached使用与优化
2008-12-26 13:01 165801、客户端在与 memcached 服务建立连接之后,进行存取 ... -
spring hibernate 事务配置 2
2008-11-27 00:13 1194<bean id="txProxyTempl ... -
spring hibernate 事务配置
2008-11-27 00:07 1427<!--事务拦截器,激活事务管理器所必须的bean ... -
我也SHOW下JDBC底层操作工具类
2008-11-10 11:15 3359/* * JDBCUtil.java * * ... -
泛型dao架构实现,封装crud等基本操作
2008-11-10 11:07 4263今天闲着没事,根据公司 ... -
项目沟通7个好习惯
2008-11-07 13:17 882写道 简介 项目沟通7个好习惯 习惯一:态度积极 习惯二:牢记 ... -
webwork+hibernate+spring项目源代码自动生成(附源代码)
2008-11-05 22:39 1520自己写了一个自动生成源代码的工具,代码自动生成,以及一个完整项 ... -
eclipse快捷键大全
2008-11-02 20:58 8361. 常用快捷键 (1)Ctrl+Space 说明:内 ... -
一个js写的StringBuffer类
2008-11-02 11:15 1335function StringBuffer() { this ... -
Spring jdbc 操作实例
2008-11-02 11:09 3148package com.szxhdz.dao; import ... -
oracle分页
2008-11-02 11:07 910从taba中获取第1到10条记录 select * fro ... -
转载40种网页常用小技巧(javascript)--备不时之需
2008-11-01 18:16 922• 转载40种网页常用小技巧(javascript)--备不时 ... -
webwork和spring整合
2008-11-01 18:11 1279始终没有搞明白在appfuse中是通过什么方式将webwork ... -
Struts标记库
2008-11-01 18:10 863Struts标记库JSP视窗组件 ... -
springIOC
2008-11-01 18:07 904首先想说说IoC(Inversion ...
相关推荐
在本文中,我们将对SpringCache与Redis集成的优雅缓存解决方案进行详细介绍。 缓存是加速服务响应速度的一种非常有效并且简单的方式。在缓存领域,有很多知名的框架,如EhCache、Guava、HazelCast等。Redis作为key-...
spring-cache-mongodb:基于MongoDB的Spring Cache实现
spring中使用缓存的方案,根据需求,使用Spring AOP + ehCache可实现些功能,使用EHCACHE能方便地结合SPRING来实现缓存。
redis主从配置流程,关键配置项,哨兵模式实现高可用。并整合spring cache功能。快速方便
简单的实现了spring cache,包括第一次存入缓存,缓存查询和缓存清空等等
1、SpringCache是Spring提供的一个缓存框架,在Spring3.1版本开始支持将缓存添加到现有的spring应用程序中,在4.1开始,缓存已支持JSR-107注释和更多自定义的选项 2、Spring Cache利用了AOP,实现了基于注解的缓存...
NULL 博文链接:https://sundoctor.iteye.com/blog/2409237
主要介绍了spring boot+spring cache实现两级缓存(redis+caffeine),小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
SpringCache+Redis实现高可用缓存解决方案.docx
缓存是实际工作中非经常常使用的一种提高性能的方法, 我们会在很多场景下来...下面这篇文章主要给大家介绍了关于Spring Cache的基本使用与实现原理的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考下
基于Spring cache 封装,可以使用spring 注解 @Cacheable 支持Spring 4(guava) 和Spring 5(caffeine) 二级缓存都使用redis 相关配置 注解支持 /** redis过期时间 */ redisExpires; /** 访问后过期时间,...
springboot1.x基于spring注解实现J2Cache两级缓存集成,一级缓存:ehcache,二级缓存:redis,代码可直接运行(根据项目中的README.md提示)
主要介绍了Spring Cache扩展功能实现解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
主要介绍了Spring Cache整合Redis实现方法详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
springcache.zip,redis或memcached对spring缓存的简单实现,redis或memcached对spring缓存的简单实现。
使用redis和springcache实现数据缓存
- Spring 缓存,包括redis、ehcache、spring-cache、memcached、使用redis实现session共享 等。 - spring-docs - Spring 文档生成工具,包括 Swagger - spring-bussiness - Spring 业务应用,包括 AOP、过滤...
今天给大家分析一下 Spring 框架本身对这些缓存...使用 Spring Cache 将大大的减少我们的Spring项目中缓存使用的复杂度,提高代码可读性。本文将从以下几个方面来认识Spring Cache框架。感兴趣的小伙伴们可以参考一下
Springcache中如何来实现缓存的更新呢?不错,@CachePut就能帮助我们来实现缓存的更新。 有的时候我们可以将@CachePut就是一个触发器,虽然这样说不太正确,但是很有助于我们的理解,当我们每次调用被他注解的方法...
Spring Cache是一个框架,实现了基于注解的缓存功能,只需要简单地加一个注解,就能实现缓存功能。