用观察者模式解决点击一次文章 update一次数据库的问题

接上文http://xuliangyong.iteye.com/blog/171240

对于第二种方法现用观察着模式来解决

思路是这样:当点击a文章(id=1234)够10次后 ,通知文章管理器更新点击次数

update article set hit_count = hit_count+10 where id = 1234

这样就减少了访问数据库的次数

 

代码如下:

Java代码 
  1. public class HitCached extends Observable{  
  2.     private static final int DEFAULT_MAX_HITS = 10;  
  3.     private Map<Long, Integer> hits = Collections.synchronizedMap(new HashMap<Long, Integer>());  
  4.       
  5.     /** 
  6.      * 最大点击量。超过该值就更新数据库 
  7.      */  
  8.     private int maxHits = DEFAULT_MAX_HITS;  
  9.       
  10.     public HitCached(){}  
  11.       
  12.     public HitCached(int maxHits){  
  13.         this.maxHits = maxHits;  
  14.     }  
  15.       
  16.     public void put(Long key, Integer value){  
  17.         hits.put(key, value);  
  18.     }  
  19.       
  20.     /** 
  21.      * 为指定key 增加指定的点击量 
  22.      * @param hitIncreased 增加的点数  
  23.      */  
  24.     public void addHit(Long key, Integer hitIncreased){  
  25.         if( !hits.containsKey(key) )  
  26.                 hits.put(key, 0);  
  27.         Integer value = hits.get(key);  
  28.         if(value + hitIncreased >= maxHits){  
  29.             setChanged();  
  30.             notifyObservers(KeyValuePair.create(key, value + hitIncreased));  
  31.             hits.remove(key);  
  32.         }else{  
  33.             hits.put(key, value + hitIncreased);  
  34.         }  
  35.           
  36.     }  
  37.       
  38.     public Integer get(Long key){  
  39.         return hits.get(key);  
  40.     }  
  41.       
  42.     public void clear(){  
  43.         hits.clear();  
  44.     }  
  45.       
  46. }  
 
Java代码 
  1. public class ArticleManagerImpl extends HibernateGenericDao<Article, Long> implements ArticleManager ,Oberver{  
  2.       
  3.     public void update(Observable o, Object arg){  
  4.         KeyValuePair keyValue = (KeyValuePair)arg;  
  5.         Article article = this.get(keyValue.getKey());  
  6.         article.setHitCount(article.getHitCount() + keyValue.getValue());  
  7.         save(article);  
  8.     }  
 

 

action中调用

Java代码 
  1. private static HitCached hitCached = new HitCached(5);  
  2.   
  3. public String view() {  
  4.         if (id != null){  
  5.             entity = articleManager.get(id);  
  6.             hitCached.addObserver(articleManager);  
  7.             hitCached.addHit(id, 1);  
  8.         }  
  9. }  

 这样没十次查看才update一次数据库 更新一次缓存 性能得到了大的提升

存在的问题:

停止服务会丢失一些数据 可加一个监听器 来处理

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值