Às vezes é necessário contar o número de cliques de cada artigo. Se o banco de dados precisar ser atualizado toda vez que for navegado, o desempenho será muito alto quando o número de visitas for grande. A melhor maneira é primeiro armazenar em cache os dados a serem atualizados e, em seguida, usar o processamento em lote do banco de dados em intervalos regulares para atualizar o banco de dados em lotes. O código fonte é o seguinte:
CountBean.java
/*
*ContData.java
*
* Criado em 18 de outubro de 2006, 16h44
*
* Para alterar este modelo, escolha Ferramentas | Opções e localize o modelo em
* o nó Criação e gerenciamento de origem Clique com o botão direito no modelo e escolha.
* Abra. Você pode então fazer alterações no modelo no Editor de código-fonte.
*/
pacote com.tot.count
;
*
* @autor http://www.tot.name
*/
classe pública CountBean {
private String countType;
int contagemId;
/** Cria uma nova instância de CountData */
público CountBean() {}
public void setCountType(String countTypes){
this.countType=countTypes;
}
public void setCountId(int contaIds){
this.countId=countIds;
}
string pública getCountType(){
return tipoContagem;
}
public int getCountId(){
retornar contagemId;
}
}
ContCache.java
/*
*ContCache.java
*
* Criado em 18 de outubro de 2006, 17h01
*
* Para alterar este modelo, escolha Ferramentas | Opções e localize o modelo em
* o nó Criação e gerenciamento de origem Clique com o botão direito no modelo e escolha.
* Abra. Você pode então fazer alterações no modelo no Editor de código-fonte.
*/
pacote com.tot.count;
importar java.util.*;
/**
*
* @autor http://www.tot.name
*/
classe pública CountCache {
lista LinkedList estática pública=new LinkedList();
/** Cria uma nova instância do CountCache */
públicoContCache() {}
public static void add(CountBean cb){
if(cb!=nulo){
lista.add(cb);
}
}
}
ContControl.java
/*
*ContThread.java
*
* Criado em 18 de outubro de 2006, 16h57
*
* Para alterar este modelo, escolha Ferramentas | Opções e localize o modelo em
* o nó Criação e gerenciamento de origem Clique com o botão direito no modelo e escolha.
* Abra. Você pode então fazer alterações no modelo no Editor de código-fonte.
*/
pacote com.tot.count;
importar tot.db.DBUtils;
importar java.sql.*;
/**
*
* @autor http://www.tot.name
*/
classe pública CountControl{
private static long lastExecuteTime=0;//Hora da última atualização private static long executeSep=60000;//Define o intervalo de atualização em milissegundos/** Cria uma nova instância de CountThread */
público CountControl() {}
público sincronizado void executeUpdate(){
Conexão conn=nulo;
Declaração Preparada ps=null;
tentar{
conexão = DBUtils.getConnection();
conn.setAutoCommit(falso);
ps=conn.prepareStatement("atualizar t_news set hits=hits+1 onde 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 [] conta = ps.executeBatch();⑶
conn.commit();
}catch(Exceção e){
e.printStackTrace();
} finalmente{
tentar{
if(ps!=nulo) {
clearParameters();
close();
ps=nulo;
}
}catch(SQLException e){}
DBUtils.closeConnection(conn);
}
}
público longo getLast(){
retornar lastExecuteTime;
}
execução nula pública(){
longo agora = System.currentTimeMillis();
if ((agora - lastExecuteTime) > executeSep) {
//System.out.print("lastExecuteTime:"+lastExecuteTime);
//System.out.print("agora:"+agora+"n");
// System.out.print(" sep="+(agora - lastExecuteTime)+"n");
lastExecuteTime=agora;
executeAtualização();
}
outro{
//System.out.print("aguarde "+(agora - lastExecuteTime)+" segundos:"+"n");
}
}
}
//Nota: Se o seu driver de banco de dados suportar processamento em lote, você pode remover os comentários antes do código marcado por ⑵ e ⑶ e adicionar a
classe de comentário antes do código ⑴ A seguir está a seguinte chamada em JSP.
<%
CountBean cb=new CountBean();
cb.setCountId(Integer.parseInt(request.getParameter("cid")));
ContagemCache.add(cb);
out.print(CountCache.list.size()+"<br>");
CountControl c=new CountControl();
c.run();
out.print(CountCache.list.size()+"<br>");
%>