用观察者模式解决点击一次文章 update一次数据库的问题
2011-06-08 21:55
381 查看
接上文http://xuliangyong.iteye.com/blog/171240
对于第二种方法现用观察着模式来解决
思路是这样:当点击a文章(id=1234)够10次后 ,通知文章管理器更新点击次数
update article set hit_count = hit_count+10 where id = 1234
这样就减少了访问数据库的次数
代码如下:
Java代码
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();
}
}
Java代码
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中调用
Java代码
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一次数据库 更新一次缓存 性能得到了大的提升
存在的问题:
停止服务会丢失一些数据 可加一个监听器 来处理
对于第二种方法现用观察着模式来解决
思路是这样:当点击a文章(id=1234)够10次后 ,通知文章管理器更新点击次数
update article set hit_count = hit_count+10 where id = 1234
这样就减少了访问数据库的次数
代码如下:
Java代码
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();
}
}
Java代码
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中调用
Java代码
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一次数据库 更新一次缓存 性能得到了大的提升
存在的问题:
停止服务会丢失一些数据 可加一个监听器 来处理
相关文章推荐
- 点击按钮一次,请求两次问题解决
- 解决了一次点击 office 文档 Windows 10 文件资源管理器软件就卡死的问题
- 记一次解决hdfs一直不退出安全模式的问题的过程
- C#设计模式之Observer观察者模式解决牛顿童鞋成绩问题示例
- JQuery在UpdatePanel中当事件点击后JQuery事件不起作用的解决办法(JQuery与UpdatePanel问题解析)
- 解决ASP.NET执行update-database命令,无法访问*.mdf本地localDb数据库文件的问题
- jQuery解决html元素中点击一次却出现多次点击结果的问题
- 按钮点击不起作用和点击一次执行两次问题解决
- 利用中介者模式与观察者解决购物车与商品列表联动问题
- 解决一次ESX上的数据库服务器的审计问题
- 完美解决因数据库一次查询数据量过大导致的内存溢出问题
- Xshell登录进入CentOS 6.5系统后,Python交互模式和数据库模式下,出现乱码的问题及解决方法
- 利用 spring bean 的属性 init-method 解决因为数据库连接没有初始化而导致首次点击页面超慢的问题
- openlayers 3 开发,点击 Overlay 请求WFS并进入下一级别(顺带解决上一次问题)
- 解决<input type=“file” multiple> 多文件上传问题(可以多次选取文件,也可以一次选取多个文件),而且点击的是一个同一个div
- SQLServer 数据库变成单个用户后无法访问问题的解决方法[在手动还原该数据库的时候,设置为单用户模式,然后其他用户访问的时候就。。。。]
- 用oralce连接.net客户端出现问题:“数据连接不成功,请检查该数据库是否已启动尝试加载oracle客户端时引发BadImageFormatException.如果在安装32位Oracle客户端组件的情况下以64位模式运行,”的解决办法
- 安装Sql Server 2008,遇到的无权限创建数据库、修改身份验证模式等问题的原因及解决方法
- 一次任务的实践,解决每秒最大并发次数的问题 -- 生产者消费者模式
- 使用观察者模式完美解决activity与fragment通信问题