JSP高访问量下的计数程序

本文介绍了一种通过缓存点击计数减少数据库负担的方法。该方法利用缓存暂时存储文章的点击次数,并通过定时批量更新数据库来降低频繁访问数据库带来的性能压力。

有时要为每一篇文章统计其点击次数,如果每一次浏览都要更新一次库的话,那性能在访问量很大的情况下,服务器的压力就会很大了,比较好一点的方法就是先将要更新的数据缓存起来,然后每隔一段时间再利用数据库的批量处理,批量更新库。源码如下:

半分钟更新一次计数.

count包中三个*.java文件

1.CountBean.java

package count;

public class CountBean {  private String countType;

 int countId;

 public CountBean() {  }

 public void setCountType(String countTypes) {   this.countType = countTypes;  }

 public void setCountId(int countIds) {   this.countId = countIds;  }

 public String getCountType() {   return countType;  }

 public int getCountId() {   return countId;  } }

2 CountCache.java

package count;

import java.util.*;

public class CountCache {  public static LinkedList list = new LinkedList();

 public CountCache() {  }

 public static void add(CountBean cb) {   if (cb != null) {    list.add(cb);   }  }

} 3.CountControl.java

package count;

import java.sql.*; import com.pp.db.*;

public class CountControl {  private static long lastExecuteTime = 0;// 上次更新时间

 private static long executeSep = 30000;// 定义更新间隔时间,单位毫秒 半分钟

 public CountControl() {  }

 public synchronized void executeUpdate() {   Connection conn = null;   PreparedStatement ps = null;   try {    conn = new DBConnection().getConn();    conn.setAutoCommit(false);    ps = conn      .prepareStatement("update t_news set hits=hits+1 where id=?");    for (int i = 0; i < CountCache.list.size(); i++) {     CountBean cb = (CountBean) CountCache.list.getFirst();     CountCache.list.removeFirst();     ps.setInt(1, cb.getCountId());     ps.executeUpdate();    // ps.addBatch();    }   // int[] counts = ps.executeBatch();    conn.commit();   } catch (Exception e) {    e.printStackTrace();   } finally {    try {     if (ps != null) {      ps.clearParameters();      ps.close();      ps = null;      conn.close();     }    } catch (SQLException e) {    }

  }  }

 public long getLast() {   return lastExecuteTime;  }

 public void run(){   long now = System.currentTimeMillis();   if ((now - lastExecuteTime) > executeSep) {     System.out.print("lastExecuteTime:"+lastExecuteTime);     System.out.print(" now:"+now+"/n");     System.out.print(" sep="+(now - lastExecuteTime)+"/n");    lastExecuteTime=now;    executeUpdate();   }   else{    System.out.print("wait for "+(now - lastExecuteTime)+" seconds:"+"/n");   }  } }

4.使用

<% CountBean cb=new CountBean(); cb.setCountId(Integer.parseInt(request.getParameter("cid")));  //计数的资源id CountCache.add(cb); System.out.print(CountCache.list.size()+"<br>"); CountControl c=new CountControl(); c.run(); System.out.print(CountCache.list.size()+"<br>"); %>

文章原贴:

http://edu.itbulo.com/200610/108505.htm

内容概要:本文详细介绍了“秒杀商城”微服务架构的设计与实战全过程,涵盖系统从需求分析、服务拆分、技术选型到核心功能开发、分布式事务处理、容器化部署及监控链路追踪的完整流程。重点解决了并发场景下的超卖问题,采用Redis预减库存、消息队列削峰、数据库乐观锁等手段保障数据一致性,并通过Nacos实现服务注册发现与配置管理,利用Seata处理跨服务分布式事务,结合RabbitMQ实现异步下单,提升系统吞吐能力。同时,项目支持Docker Compose快速部署和Kubernetes生产级编排,集成Sleuth+Zipkin链路追踪与Prometheus+Grafana监控体系,构建可观测性强的微服务系统。; 适合人群:具备Java基础和Spring Boot开发经验,熟悉微服务基本概念的中级研发人员,尤其是希望深入理解并发系统设计、分布式事务、服务治理等核心技术的开发者;适合工作2-5年、有志于转型微服务或提升架构能力的工程师; 使用场景及目标:①学习如何基于Spring Cloud Alibaba构建完整的微服务项目;②掌握秒杀场景下并发、超卖控制、异步化、削峰填谷等关键技术方案;③实践分布式事务(Seata)、服务熔断降级、链路追踪、统一配置中心等企业级中间件的应用;④完成从本地开发到容器化部署的全流程落地; 阅读建议:建议按照文档提供的七个阶段循序渐进地动手实践,重点关注秒杀流程设计、服务间通信机制、分布式事务实现和系统性能优化部分,结合代码调试与监控工具深入理解各组件协作原理,真正掌握并发微服务系统的构建能力。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值