JSP高访问量下的计数程序

59 篇文章 0 订阅

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

半分钟更新一次计数.

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值