接上文http://xuliangyong.iteye.com/blog/171240
对于第二种方法现用观察着模式来解决
思路是这样:当点击a文章(id=1234)够10次后 ,通知文章管理器更新点击次数
update article set hit_count = hit_count+10 where id = 1234
这样就减少了访问数据库的次数
代码如下:
- publicclassHitCachedextendsObservable{
- privatestaticfinalintDEFAULT_MAX_HITS=10;
- privateMap<Long,Integer>hits=Collections.synchronizedMap(newHashMap<Long,Integer>());
- privateintmaxHits=DEFAULT_MAX_HITS;
- publicHitCached(){}
- publicHitCached(intmaxHits){
- this.maxHits=maxHits;
- }
- publicvoidput(Longkey,Integervalue){
- hits.put(key,value);
- }
- publicvoidaddHit(Longkey,IntegerhitIncreased){
- if(!hits.containsKey(key))
- hits.put(key,0);
- Integervalue=hits.get(key);
- if(value+hitIncreased>=maxHits){
- setChanged();
- notifyObservers(KeyValuePair.create(key,value+hitIncreased));
- hits.remove(key);
- }else{
- hits.put(key,value+hitIncreased);
- }
- }
- publicIntegerget(Longkey){
- returnhits.get(key);
- }
- publicvoidclear(){
- hits.clear();
- }
- }
- publicclassArticleManagerImplextendsHibernateGenericDao<Article,Long>implementsArticleManager,Oberver{
- publicvoidupdate(Observableo,Objectarg){
- KeyValuePairkeyValue=(KeyValuePair)arg;
- Articlearticle=this.get(keyValue.getKey());
- article.setHitCount(article.getHitCount()+keyValue.getValue());
- save(article);
- }
action中调用
- privatestaticHitCachedhitCached=newHitCached(5);
- publicStringview(){
- if(id!=null){
- entity=articleManager.get(id);
- hitCached.addObserver(articleManager);
- hitCached.addHit(id,1);
- }
- }
这样没十次查看才update一次数据库 更新一次缓存 性能得到了大的提升
存在的问题:
停止服务会丢失一些数据 可加一个监听器 来处理
分享到:
相关推荐
在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 应用。这个应用不仅展示了如何...
当数据库中的数据发生变化时,Chewy可以通过观察者模式自动更新Elasticsearch中的索引。只需在模型上添加`update_index`方法即可。 ```ruby class User after_save { UsersIndex::User.update_all } end ``` 七、...