有时要为每一篇文章统计其点击次数,如果每一次浏览都要更新一次库的话,那性能在访问量很大的情况下,服务器的压力就会很大了,比较好一点的方法就是先将要更新的数据缓存起来,然后每隔一段时间再利用数据库的批量处理,批量更新库。
那么下面本JSP教程提供源码如下:
- CountBean.java
- /*
- * CountData.java
- *
- * Created on 2009年6月30日, 下午4:44
- *
- * To change this template, choose Tools | Options and locate the template under
- * the Source Creation and Management node. Right-click the template and choose
- * Open. You can then make changes to the template in the Source Editor.
- */
- package com.tot.count;
- /**
- *
- *
- */
- public class CountBean {
- private String countType;
- int countId;
- /** Creates a new instance of CountData */
- 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;
- }
- }
- CountCache.java
- /*
- * CountCache.java
- *
- * Created on 2009年6月30日, 下午5:01
- *
- * To change this template, choose Tools | Options and locate the template under
- * the Source Creation and Management node. Right-click the template and choose
- * Open. You can then make changes to the template in the Source Editor.
- */
- package com.tot.count;
- import java.util.*;
- /**
- *
- * @author http://www.tot.name
- */
- public class CountCache {
- public static LinkedList list=new LinkedList();
- /** Creates a new instance of CountCache */
- public CountCache() {}
- public static void add(CountBean cb){
- if(cb!=null){
- list.add(cb);
- }
- }
- }
- CountControl.java
- /*
- * CountThread.java
- *
- * Created on 2009年6月30日, 下午4:57
- *
- * To change this template, choose Tools | Options and locate the template under
- * the Source Creation and Management node. Right-click the template and choose
- * Open. You can then make changes to the template in the Source Editor.
- */
- package com.tot.count;
- import tot.db.DBUtils;
- import java.sql.*;
- /**
- *
- * @author http://www.tot.name
- */
- public class CountControl{
- private static long lastExecuteTime=0;//上次更新时间
- private static long executeSep=60000;//定义更新间隔时间,单位毫秒
- /** Creates a new instance of CountThread */
- public CountControl() {}
- public synchronized void executeUpdate(){
- Connection conn=null;
- PreparedStatement ps=null;
- try{
- conn = DBUtils.getConnection();
- conn.setAutoCommit(false);
- ps=conn.prepareStatement("update t_news set hitshits=hits+1 where id=?");
- for(int i=0;iCountCache.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;
- }
- }catch(SQLException e){}
- DBUtils.closeConnection(conn);
- }
- }
- 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");
- }
- }
- }
- //注:如果你的数据库驱动支持批处理,那么可以将⑵,⑶标记的代码前的注释去掉,同时在代码⑴前加上注释
- 类写好了,下面是在JSP中如下调用。
- %
- CountBean cb=new CountBean();
- cb.setCountId(Integer.parseInt(request.getParameter("cid")));
- CountCache.add(cb);
- out.print(CountCache.list.size()+"br");
- CountControl c=new CountControl();
- c.run();
- out.print(CountCache.list.size()+"br");
- %
以上就是本JSP教程为你提供的解决高访问量下的服务器压力问题,希望对你有帮助。