接上文http://xuliangyong.iteye.com/blog/171240
对于第二种方法现用观察着模式来解决
思路是这样:当点击a文章(id=1234)够10次后 ,通知文章管理器更新点击次数
update article set hit_count = hit_count+10 where id = 1234
这样就减少了访问数据库的次数
代码如下:
public class HitCached extends Observable{
private static final int DEFAULT_MAX_HITS = 10;
private Map<Long, Integer> hits = Collections.synchronizedMap(new HashMap<Long, Integer>());
/**
* 最大点击量。超过该值就更新数据库
*/
private int maxHits = DEFAULT_MAX_HITS;
public HitCached(){}
public HitCached(int maxHits){
this.maxHits = maxHits;
}
public void put(Long key, Integer value){
hits.put(key, value);
}
/**
* 为指定key 增加指定的点击量
* @param hitIncreased 增加的点数
*/
public void addHit(Long key, Integer hitIncreased){
if( !hits.containsKey(key) )
hits.put(key, 0);
Integer value = hits.get(key);
if(value + hitIncreased >= maxHits){
setChanged();
notifyObservers(KeyValuePair.create(key, value + hitIncreased));
hits.remove(key);
}else{
hits.put(key, value + hitIncreased);
}
}
public Integer get(Long key){
return hits.get(key);
}
public void clear(){
hits.clear();
}
}
public class ArticleManagerImpl extends HibernateGenericDao<Article, Long> implements ArticleManager ,Oberver{
public void update(Observable o, Object arg){
KeyValuePair keyValue = (KeyValuePair)arg;
Article article = this.get(keyValue.getKey());
article.setHitCount(article.getHitCount() + keyValue.getValue());
save(article);
}
action中调用
private static HitCached hitCached = new HitCached(5);
public String view() {
if (id != null){
entity = articleManager.get(id);
hitCached.addObserver(articleManager);
hitCached.addHit(id, 1);
}
}
这样没十次查看才update一次数据库 更新一次缓存 性能得到了大的提升
存在的问题:
停止服务会丢失一些数据 可加一个监听器 来处理
分享到:
相关推荐
尽管给定材料主要讲述的是观察者模式,但在实际开发中,策略模式与观察者模式常常被组合使用,以实现更复杂的功能需求。 #### 2.1 观察者模式概述 观察者模式是一种软件设计模式,它定义了对象之间的依赖关系,当一...
在Java中,除了标准库提供的Observable和Observer之外,还可以使用第三方库如Guava的EventBus或Spring框架的ApplicationEventPublisher接口来实现观察者模式,这些库提供了更高级的功能和更好的扩展性。 总之,...
- **为何使用**:观察者模式用于解耦对象之间的依赖关系,当一个对象状态改变时,所有依赖于它的对象都能得到通知,而不需要显式地调用这些对象的方法。 - **实现**:定义一个`Subject`接口,它维护一个观察者列表...
3. **观察者模式**:定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。在PHP中,它常用于事件驱动编程,如用户登录、购物车操作等。 ```php interface ...
10. **LiveData和Room Persistence Library**:随着Android架构组件的引入,LiveData和Room库提供了更现代的方式来处理SQLite数据库,LiveData提供了一个观察者模式的数据持有者,而Room则提供了更高级别的抽象,...
【新闻文章】Bay_News V1.0.0 北雨新闻信息管理系统是基于JSP技术开发的一个实用...通过实践这个项目,你不仅能提升你的编程技能,还能增强对Web开发流程的理解,这对于想要从事IT行业的你来说,是一次宝贵的学习机会。
LiveData是Android架构组件之一,提供观察者模式,实时响应数据变化;Room是SQLite的抽象层,简化了数据库操作,同时支持LiveData,使数据管理更加便捷。 9. 数据库升级 随着应用迭代,数据库结构可能需要更新。...
10. **设计模式**:代码可能体现了常见的设计模式,如单例模式(用于日志类)、工厂模式(用于创建数据库连接)或观察者模式(用于实时更新UI)。 通过深入分析“codesc.net”文件,我们可以学习到上述各个知识点的...
8. **软件工程**:设计模式(如单例模式、工厂模式、观察者模式等),版本控制(如Git),以及代码调试和测试方法。 9. **计算机系统**:了解计算机组成原理,包括CPU、内存、I/O设备的工作原理,以及汇编语言的...
- Android Architecture Components中的`LiveData`是观察者模式的实现,能自动处理UI与数据的同步。 - `Room`是Google提供的一个SQL方言库,它提供了更高级别的抽象,简化了SQLite操作,同时兼容LiveData,提高了...
8. **设计模式**:设计模式是解决常见编程问题的模板,如单例、工厂、装饰器、代理、观察者、策略等23种设计模式。熟练运用设计模式可以提高代码的可读性和可维护性。 9. **其他**:还包括异常处理、反射、注解、...
- **观察者模式**:事件监听机制的实现原理及案例分析。 #### Oracle相关知识点 ##### 1. SQL基础 - **DDL语句**:CREATE TABLE、DROP TABLE、ALTER TABLE等表定义语句。 - **DML语句**:INSERT、UPDATE、DELETE等...
7. **观察者(Observer)机制**:ContentProvider支持观察者模式,当数据发生变化时,可以通过`ContentResolver.registerContentObserver()`注册一个ContentObserver,它会在数据改变时接收到通知。这对于实时更新UI...
2. 性能优化:为了提升用户体验,可以考虑在异步线程中执行数据库操作,并使用 LiveData 或其他观察者模式来实时更新 UI。 通过以上步骤,我们就实现了一个基本的 Android Notebook 应用。这个应用不仅展示了如何...
- **观察者模式:** 实现事件驱动模型的关键。 - **适配器模式:** 使接口不兼容的类可以一起工作。 ##### 5. 单例模式 **知识点:** - **定义:** 保证一个类只有一个实例,并提供一个全局访问点。 - **实现:** 使用...
当数据库中的数据发生变化时,Chewy可以通过观察者模式自动更新Elasticsearch中的索引。只需在模型上添加`update_index`方法即可。 ```ruby class User after_save { UsersIndex::User.update_all } end ``` 七、...