`

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

阅读更多

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

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

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

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

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

代码如下:

Java代码
  1. publicclassHitCachedextendsObservable{
  2. privatestaticfinalintDEFAULT_MAX_HITS=10;
  3. privateMap<Long,Integer>hits=Collections.synchronizedMap(newHashMap<Long,Integer>());
  4. /**
  5. *最大点击量。超过该值就更新数据库
  6. */
  7. privateintmaxHits=DEFAULT_MAX_HITS;
  8. publicHitCached(){}
  9. publicHitCached(intmaxHits){
  10. this.maxHits=maxHits;
  11. }
  12. publicvoidput(Longkey,Integervalue){
  13. hits.put(key,value);
  14. }
  15. /**
  16. *为指定key增加指定的点击量
  17. *@paramhitIncreased增加的点数
  18. */
  19. publicvoidaddHit(Longkey,IntegerhitIncreased){
  20. if(!hits.containsKey(key))
  21. hits.put(key,0);
  22. Integervalue=hits.get(key);
  23. if(value+hitIncreased>=maxHits){
  24. setChanged();
  25. notifyObservers(KeyValuePair.create(key,value+hitIncreased));
  26. hits.remove(key);
  27. }else{
  28. hits.put(key,value+hitIncreased);
  29. }
  30. }
  31. publicIntegerget(Longkey){
  32. returnhits.get(key);
  33. }
  34. publicvoidclear(){
  35. hits.clear();
  36. }
  37. }
Java代码
  1. publicclassArticleManagerImplextendsHibernateGenericDao<Article,Long>implementsArticleManager,Oberver{
  2. publicvoidupdate(Observableo,Objectarg){
  3. KeyValuePairkeyValue=(KeyValuePair)arg;
  4. Articlearticle=this.get(keyValue.getKey());
  5. article.setHitCount(article.getHitCount()+keyValue.getValue());
  6. save(article);
  7. }

action中调用

Java代码
  1. privatestaticHitCachedhitCached=newHitCached(5);
  2. publicStringview(){
  3. if(id!=null){
  4. entity=articleManager.get(id);
  5. hitCached.addObserver(articleManager);
  6. hitCached.addHit(id,1);
  7. }
  8. }

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

存在的问题:

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

分享到:
评论

相关推荐

    Observer设计模式

    在Java中,除了标准库提供的Observable和Observer之外,还可以使用第三方库如Guava的EventBus或Spring框架的ApplicationEventPublisher接口来实现观察者模式,这些库提供了更高级的功能和更好的扩展性。 总之,...

    PHP中常用的三种设计模式详解【单例模式、工厂模式、观察者模式】

    - **为何使用**:观察者模式用于解耦对象之间的依赖关系,当一个对象状态改变时,所有依赖于它的对象都能得到通知,而不需要显式地调用这些对象的方法。 - **实现**:定义一个`Subject`接口,它维护一个观察者列表...

    php语言的设计模式

    3. **观察者模式**:定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。在PHP中,它常用于事件驱动编程,如用户登录、购物车操作等。 ```php interface ...

    android_sqlite

    10. **LiveData和Room Persistence Library**:随着Android架构组件的引入,LiveData和Room库提供了更现代的方式来处理SQLite数据库,LiveData提供了一个观察者模式的数据持有者,而Room则提供了更高级别的抽象,...

    [新闻文章]bay_news V1.0.0 北雨新闻信息管理系统_bynews.rar

    【新闻文章】Bay_News V1.0.0 北雨新闻信息管理系统是基于JSP技术开发的一个实用...通过实践这个项目,你不仅能提升你的编程技能,还能增强对Web开发流程的理解,这对于想要从事IT行业的你来说,是一次宝贵的学习机会。

    应用源码之SQLiteSample.zip

    LiveData是Android架构组件之一,提供观察者模式,实时响应数据变化;Room是SQLite的抽象层,简化了数据库操作,同时支持LiveData,使数据管理更加便捷。 9. 数据库升级 随着应用迭代,数据库结构可能需要更新。...

    VS.NET VC .NET写的日志程序.rar

    10. **设计模式**:代码可能体现了常见的设计模式,如单例模式(用于日志类)、工厂模式(用于创建数据库连接)或观察者模式(用于实时更新UI)。 通过深入分析“codesc.net”文件,我们可以学习到上述各个知识点的...

    000000000000000000000000000000000000000000000000000

    8. **软件工程**:设计模式(如单例模式、工厂模式、观察者模式等),版本控制(如Git),以及代码调试和测试方法。 9. **计算机系统**:了解计算机组成原理,包括CPU、内存、I/O设备的工作原理,以及汇编语言的...

    SQLiteStudy

    - Android Architecture Components中的`LiveData`是观察者模式的实现,能自动处理UI与数据的同步。 - `Room`是Google提供的一个SQL方言库,它提供了更高级别的抽象,简化了SQLite操作,同时兼容LiveData,提高了...

    java面试笔试题大汇总 ~很全面 -

    8. **设计模式**:设计模式是解决常见编程问题的模板,如单例、工厂、装饰器、代理、观察者、策略等23种设计模式。熟练运用设计模式可以提高代码的可读性和可维护性。 9. **其他**:还包括异常处理、反射、注解、...

    IBM笔试题—网络资源(整理的)

    - **观察者模式**:事件监听机制的实现原理及案例分析。 #### Oracle相关知识点 ##### 1. SQL基础 - **DDL语句**:CREATE TABLE、DROP TABLE、ALTER TABLE等表定义语句。 - **DML语句**:INSERT、UPDATE、DELETE等...

    Android ContentProvider简单实现

    7. **观察者(Observer)机制**:ContentProvider支持观察者模式,当数据发生变化时,可以通过`ContentResolver.registerContentObserver()`注册一个ContentObserver,它会在数据改变时接收到通知。这对于实时更新UI...

    Note android

    2. 性能优化:为了提升用户体验,可以考虑在异步线程中执行数据库操作,并使用 LiveData 或其他观察者模式来实时更新 UI。 通过以上步骤,我们就实现了一个基本的 Android Notebook 应用。这个应用不仅展示了如何...

    Ruby-chewy高级ElasticsearchRuby框架

    当数据库中的数据发生变化时,Chewy可以通过观察者模式自动更新Elasticsearch中的索引。只需在模型上添加`update_index`方法即可。 ```ruby class User after_save { UsersIndex::User.update_all } end ``` 七、...

Global site tag (gtag.js) - Google Analytics