Sometimes it is necessary to count the number of clicks for each article. If the database needs to be updated every time it is browsed, the performance will be very high when the number of visits is large. The pressure on the server will be great. A better way is to first Cache the data to be updated, and then use the batch processing of the database at regular intervals to update the database in batches. The source code is as follows:
CountBean.java
/*
*CountData.java
*
* Created on October 18, 2006, 4:44 pm
*
* 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;
/**
*
* @author http://www.tot.name
*/
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 October 18, 2006, 5:01 pm
*
* 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 October 18, 2006, 4:57 pm
*
* 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;//Last update time private static long executeSep=60000;//Define the update interval in milliseconds/** 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 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;
}
}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");
}
}
}
//Note: If your database driver supports batch processing, you can remove the comments before the code marked by ⑵ and ⑶, and add the comment
class before the code ⑴. The following is the following call in 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>");
%>