記事ごとにクリック数をカウントする必要がある場合、アクセス数が多いとパフォーマンスが非常に高くなります。より良い方法は、まず更新するデータをキャッシュし、その後定期的にデータベースのバッチ処理を使用してデータベースをバッチで更新することです。ソースコードは次のとおりです。
CountBean.java
/*
*CountData.java
*
※2006年10月18日16時44分作成
*
* このテンプレートを変更するには、[ツール]、[オプション] の順に選択し、次のテンプレートを見つけます。
* ソースの作成と管理ノード テンプレートを右クリックして選択します。
* 開く。ソース エディタでテンプレートを変更できます。
*/
パッケージ com.tot.count
/**
*
* @author http://www.tot.name
*/
パブリック クラス CountBean {
プライベート文字列 countType;
int countId;
/** CountData の新しいインスタンスを作成します */
public CountBean() {}
public void setCountType(String countTypes){
this.countType=countTypes;
}
public void setCountId(int countIds){
this.countId=カウントID;
}
public String getCountType(){
countType を返します。
}
public int getCountId(){
countId を返します。
}
}
CountCache.java
/*
*CountCache.java
*
※2006年10月18日17時01分作成
*
* このテンプレートを変更するには、[ツール]、[オプション] の順に選択し、次のテンプレートを見つけます。
* ソースの作成と管理ノード テンプレートを右クリックして選択します。
* 開く。ソース エディタでテンプレートを変更できます。
*/
パッケージ com.tot.count;
java.util.* をインポートします。
/**
*
* @author http://www.tot.name
*/
パブリック クラス CountCache {
public static LinkedList list=new LinkedList();
/** CountCache の新しいインスタンスを作成します */
パブリック CountCache() {}
public static void add(CountBean cb){
if(cb!=null){
list.add(cb);
}
}
}
CountControl.java
/*
*CountThread.java
*
※2006年10月18日16時57分作成
*
* このテンプレートを変更するには、[ツール]、[オプション] の順に選択し、次のテンプレートを見つけます。
* ソースの作成と管理ノード テンプレートを右クリックして選択します。
* 開く。ソース エディタでテンプレートを変更できます。
*/
パッケージ com.tot.count;
tot.db.DBUtils をインポートします。
インポート java.sql.*;
/**
*
* @author http://www.tot.name
*/
パブリック クラス CountControl{
private static long lastExecuteTime=0;//最終更新時刻 private static longexecuteSep=60000;//更新間隔をミリ秒単位で定義します/** CountThread の新しいインスタンスを作成します */
public CountControl() {}
public synchronized voidexecuteUpdate(){
接続 conn=null;
PreparedStatement ps=null;
試す{
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 [] カウント = ps.executeBatch();⑶
conn.commit();
}catch(例外 e){
e.printStackTrace();
} ついに{
試す{
if(ps!=null) {
ps.clearParameters();
ps.close();
ps=null;
}
}catch(SQLException e){}
DBUtils.closeConnection(conn);
}
}
public long getLast(){
lastExecuteTime を返します。
}
public void run(){
長い間 = 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=今;
実行更新();
}
それ以外{
//System.out.print(""+(now - lastExecuteTime)+" 秒間待ちます:"+"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>");
%>