最近做網站的開發,需要做網站的通路量統計,以前也做過這方面的東西,不過以前做的時候是在asp下做的,而且隻能實作簡單的網站曆史總通路量的統計,且通路的資料是放在檔案一個檔案中的,現在在jsp下實作,個人感覺如果再用檔案的形式來存貯通路量的話,就有點辱沒java語言的強大功能了,是以自己設計了一個網站通路量統計的程式,現帖出如下,希望對jsp開發的同學有幫助
首先說一下設計的思想,由于通路量需要在每個頁面進行顯示,如果每次都進行檔案的讀寫,或是查詢資料庫的話,顯示是極其浪費資源的,是以以下的程式,采用了緩存的方式,對通路量進行緩存,并在更新緩存的同時同步更新庫中的資料,(說點題外話,這一步讀者可以自己視情況而改為每隔一定的時間向資料庫寫一次資料,這樣會占用更少的資源,而達到同樣的效果,這裡筆者隻是以沒有采用這種方式,是因為目前的java虛拟機還沒有一種釋放緩存并通知使用者程式的機制,也就是說,如果系統資源不足,或是緩存的資源長時間未利用時,java虛拟機很可能會釋放緩存,而在釋放緩存之前虛拟機并不會通知程式做善後的處理,進而造成資料的丢失,而且虛拟機釋放資源的時間也是不确定的,因為如果系統資源充足,有可能即使不用,也會隔很長一段時間系統才會釋放緩存資源,是以讀者如果采用這種方式進行操作進,對更新資料庫的時間間隔一定要把握好),不過再查詢通路量的時候,先通路緩存的資源,如果沒有再查資料庫,并将查到的資料緩存,這樣在一段時間間隔内再次顯示的時候就不用再次查詢資料庫了。好了,閑話少說,下面介紹實作方法吧
步驟一、建一個表,表名任意,這裡取名為:visitorcounter,當然讀者可以自己取一個更加規範的資料庫表名,表的結構如下所示:
+-------+------------------+------+-----+------------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------+------------------+------+-----+------------+----------------+
| id | int(11) unsigned | NO | PRI | NULL | auto_increment |
| vdate | date | NO | | 2000-01-01 | |
| vnum | int(11) | NO | | 0 | |
+-------+------------------+------+-----+------------+----------------+
步驟二、建立一個java類,名字也為:visitorcounter,這個檔案名字讀者也是任意起,按照自己的規範能明白其含義即可,(注意以下在資料庫連接配接的時候使用了資料庫連接配接沲來進行連接配接,相應的的類可見我部落格資料連接配接沲的應用)類的内容如下:
package com.hdzx.pub;
import java.sql.ResultSet;
import java.text.SimpleDateFormat;
import java.util.Date;
public class VisitorCounter {
private final static String TABLE_NAME = "visitorcounter";
private static String today = null;
private static long today_num = 0;
private static long total_num = 0;
//加載通路量
public static void loadNum(){
if(total_num<1)
loadTotalNum();
if(today_num<1)
loadToadyNum();
}
//加載今日通路量
private static void loadToadyNum() {
// TODO Auto-generated method stub
DBConnect db = null;
ResultSet rs = null;
if(today==null)
today = getTodayDate();
String sql = "select vnum from "+TABLE_NAME+" where vdate='"+today+"'";
try {
db = new DBConnect();
rs = db.executeQuery(sql);
if(rs.next()){
today_num = rs.getLong("vnum");
}
else
{
sql = "insert into "+TABLE_NAME+"(vdate,vnum) values('"+today+"',0)";
db.executeUpdate(sql);
today_num = 0;
}
} catch (Exception e) {
// TODO: handle exception
today_num = 0;
System.out.println("com.hdzx.pub~VisitorCounter.incTotalCounter:獲得通路人數");
}
}
//加載總通路量
private static void loadTotalNum() {
// TODO Auto-generated method stub
// TODO Auto-generated method stub
DBConnect db = null;
ResultSet rs = null;
if(today==null)
today = getTodayDate();
String sql = "select vnum from "+TABLE_NAME+" where id=1";
try {
db = new DBConnect();
rs = db.executeQuery(sql);
if(rs.next()){
total_num = rs.getLong("vnum");
}
else
{
total_num = 0;
}
} catch (Exception e) {
// TODO: handle exception
total_num = 0;
System.out.println("com.hdzx.pub~VisitorCounter.incTotalCounter:獲得通路人數");
}
}
//增加總的通路量
private static int incTotalCounter(){
int k = 0;
DBConnect db = null;
loadNum();
total_num = total_num+1;
String sql = "update "+TABLE_NAME+" set vnum="+total_num+" where id=1";
try {
db = new DBConnect();
k = db.executeUpdate(sql);
} catch (Exception e) {
// TODO: handle exception
System.out.println("com.hdzx.pub~VisitorCounter.incTotalCounter:增加通路人數");
}
return k;
}
//增加今日的通路量
public static int incTodayCounter(){
int k = 0;
DBConnect db = null;
String sql = null;
loadNum();
today_num += 1;
sql = "update "+TABLE_NAME+" set vnum="+today_num+" where vdate='"+today+"'";
try {
db = new DBConnect();
k = db.executeUpdate(sql);
if(k > 0)
incTotalCounter();
} catch (Exception e) {
// TODO: handle exception
System.out.println("com.hdzx.pub~VisitorCounter.incTotalCounter:增加通路人數");
}
return k;
}
//獲得今天的日期
private static String getTodayDate(){
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
return sdf.format(new Date());
}
///獲得今日通路量
public static long getTodayNum(){
loadNum();
return today_num;
}
//獲得總的通路量
public static long getTotalNum(){
loadNum();
return total_num;
}
}
步驟三、經過以上的步驟後,在頁面中加入以下的代碼,就可以實作網站通路量的統計工作:
if(session.isNew())
{
VisitorCounter.incTodayCounter();
}
%>
今日通路量:<%=VisitorCounter.getTodayNum() %><br/>
總的通路量: <%=VisitorCounter.getTotalNum() %>