0

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

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

我怎么能那样做?我不知道如何安排每个午夜对我的应用程序说的操作进行 INSERT 并重置变量...

任何想法?

谢谢!:)

4

2 回答 2

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);
于 2017-08-14T13:38:38.410 回答
0

经过长时间寻找解决方案,我发现 Timer 不能很好地与 Servlets 一起使用,所以我使用了这个(并且效果很好!:) 这是过滤器的代码:

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 来避免在某些事情失败时停止可运行的操作非常重要。

问候!

于 2017-08-25T13:51:25.157 回答