用Servlets命中计数器方法

时间:2017-08-14 12:37:30

标签: java servlets scheduled-tasks servlet-filters hitcounter

我想使用Java Servlets在我的数据库中创建一个命中计数器寄存器。主要思想是使用过滤器,并在每次用户访问时增加计数器。

我不想在每次访问时在数据库中进行更新(我发现这不是太高效)。我更喜欢使用每次访问都会增加的静态变量,并且在一天结束时,使用该变量的值对DB进行INSERT并将其重置为零。

我怎么能这样做?我不知道如何安排一个每隔午夜对我的应用程序说出一个INSERT并重置变量的accion ...

有什么想法吗?

谢谢! :)

2 个答案:

答案 0 :(得分:2)

您可以使用java.util.Timer

    Timer t = new Timer("myTimer");
    t.schedule(new TimerTask() {

        @Override
        public void run() {
            if (count != lastCount) {
                count = lastCount;
                // TODO: update into database
            }
        }
    }, 0, 2000);

答案 1 :(得分:0)

经过很长一段时间寻找解决方案后,我发现Timer与Servlet不兼容,所以我使用了它(并且效果很好!:)这是过滤器的代码:

public class LogVisitorsListener implements ServletContextListener {

    private ScheduledExecutorService scheduler;

    @Override
    public void contextInitialized(ServletContextEvent sce) {
        scheduler = Executors.newSingleThreadScheduledExecutor();

        // It will be executed every 1 hour
        scheduler.scheduleAtFixedRate(new DailyHitsRunnable(), 0, 1, TimeUnit.HOURS); 
    }

    @Override
    public void contextDestroyed(ServletContextEvent sce) {
        scheduler.shutdownNow();
    }
}

我的班级DailyHitsRunnable:

public class DailyHitsRunnable implements Runnable {
@Override
    public void run() {
        try {
            // stuff here...
        } 
        catch(Throwable t) {
            // catch work here...
        }
    }
}

使用try / catch非常重要,以避免在出现故障时停止runnable动作停止。

问候!