javaEE如何统计日访问量和总访问量?

时间:2021-04-11 20:58:34
package com.space.model;

import java.text.SimpleDateFormat;
import java.util.Date;

public class Count {
private int totalCount;
private int todayCount;
private Date date = new Date();
private static Count instance = null;

public static Count getInstance() {
if (instance == null) {
instance = new Count();
}
return instance;
}

public int getTotalCount() {
return totalCount;
}
public void setTotalCount(int totalCount) {
this.totalCount = totalCount;
}
public int getTodayCount() {
return todayCount;
}
public void setTodayCount(int todayCount) {
this.todayCount = todayCount;
}
public Date getDate() {
return date;
}
public void setDate(Date date) {
this.date = date;
}

public synchronized void addCount(Date date) {// 比较日期增加计数
if (new SimpleDateFormat("yyyy-MM-dd").format(this.getDate()).equals(
new SimpleDateFormat("yyyy-MM-dd").format(date))){
this.setTodayCount(this.getTodayCount() + 1);
}else{
this.setTodayCount(1);
}
this.setTotalCount(this.getTotalCount() + 1);
System.out.println("today->"+this.getTodayCount());
System.out.println("total->"+this.getTotalCount());
}
}

上面是我的Count类,封装了日访问量和总访问量两个数据
然后是过滤器:
HttpSession session = request.getSession();
ServletContext context = request.getServletContext();
Count count = null;
count = (Count) context.getAttribute("count");
if (null == count) {
count = Count.getInstance();
}
if(session.isNew())
count.addCount(new Date());
context.setAttribute("count", count);


但是我好像无法统计日访问量,日访问量总是和总访问量一样,我现在想做的是每次一到24:00,就将Count中的date变量置为new Date().但是不知道怎么做。

7 个解决方案

#1


简单的方式,搞一个java.util.Timer定时器来定时更新时间就好了。

#2


登录就算一次 每个ip一天只能一次 第一次写进数据库 

#3


引用 2 楼 ylovep 的回复:
登录就算一次 每个ip一天只能一次 第一次写进数据库 

当访问量巨大的时候,写进数据库的这种方式,就不科学了;
无端增加了数据库的压力,而且这种存储访问量的活儿,交给硬盘,记录在文本里即可。
也可以在某一个时刻再一次性写进库里。

#4


用timer定时器

#5


代码就不写了,提供一个思路给你,希望能用到,首先得到application会话对象,因为这个对象是对整个应用都起作用的,里面存储一个值(访问数量),每次访问就+1这样就避免了频繁的操作数据库,等到每天24:00整的时候,将这个数据存入数据库里,然后将application中的值初始化为0,第二天的话,还是一样,直接24:00累加存入到数据库中,然后将应用中的数据初始化为0即可,还有一点就是写个监听器,当web应用关闭的时候将当前applicaiton的数据保存起来,这样才不会因为服务器down掉而少纳入总数中。望采纳。

#6


将Count中的date变量置为new Date()  一般没有这么做的,你可以用quartz 定时任务,设置每天0点的时候执行你的代码,剩下的 就可以参考5L的思路,不用application可以用本地内存的方式,如果访问量很大的话,也可以用 memcache

#7


引用 5 楼 u010737972 的回复:
代码就不写了,提供一个思路给你,希望能用到,首先得到application会话对象,因为这个对象是对整个应用都起作用的,里面存储一个值(访问数量),每次访问就+1这样就避免了频繁的操作数据库,等到每天24:00整的时候,将这个数据存入数据库里,然后将application中的值初始化为0,第二天的话,还是一样,直接24:00累加存入到数据库中,然后将应用中的数据初始化为0即可,还有一点就是写个监听器,当web应用关闭的时候将当前applicaiton的数据保存起来,这样才不会因为服务器down掉而少纳入总数中。望采纳。

思路我都知道啊,只是代码实现的时候有点不知道如何处理。

#1


简单的方式,搞一个java.util.Timer定时器来定时更新时间就好了。

#2


登录就算一次 每个ip一天只能一次 第一次写进数据库 

#3


引用 2 楼 ylovep 的回复:
登录就算一次 每个ip一天只能一次 第一次写进数据库 

当访问量巨大的时候,写进数据库的这种方式,就不科学了;
无端增加了数据库的压力,而且这种存储访问量的活儿,交给硬盘,记录在文本里即可。
也可以在某一个时刻再一次性写进库里。

#4


用timer定时器

#5


代码就不写了,提供一个思路给你,希望能用到,首先得到application会话对象,因为这个对象是对整个应用都起作用的,里面存储一个值(访问数量),每次访问就+1这样就避免了频繁的操作数据库,等到每天24:00整的时候,将这个数据存入数据库里,然后将application中的值初始化为0,第二天的话,还是一样,直接24:00累加存入到数据库中,然后将应用中的数据初始化为0即可,还有一点就是写个监听器,当web应用关闭的时候将当前applicaiton的数据保存起来,这样才不会因为服务器down掉而少纳入总数中。望采纳。

#6


将Count中的date变量置为new Date()  一般没有这么做的,你可以用quartz 定时任务,设置每天0点的时候执行你的代码,剩下的 就可以参考5L的思路,不用application可以用本地内存的方式,如果访问量很大的话,也可以用 memcache

#7


引用 5 楼 u010737972 的回复:
代码就不写了,提供一个思路给你,希望能用到,首先得到application会话对象,因为这个对象是对整个应用都起作用的,里面存储一个值(访问数量),每次访问就+1这样就避免了频繁的操作数据库,等到每天24:00整的时候,将这个数据存入数据库里,然后将application中的值初始化为0,第二天的话,还是一样,直接24:00累加存入到数据库中,然后将应用中的数据初始化为0即可,还有一点就是写个监听器,当web应用关闭的时候将当前applicaiton的数据保存起来,这样才不会因为服务器down掉而少纳入总数中。望采纳。

思路我都知道啊,只是代码实现的时候有点不知道如何处理。