Sql事件与Sevlet中的ScheduledExecutorService相对应

时间:2016-09-06 10:05:51

标签: java mysql servlets

我为不同的表单提交构建了一个Web应用程序。我的要求是,我希望自动每年1月1日删除一次我的数据库。为此,我找到了两个选择。

First is ScheduledExecutorService in servlet。例如

@WebListener
public class BackgroundJobManager implements ServletContextListener {
    private ScheduledExecutorService scheduler;
    public void contextInitialized(ServletContextEvent event) {
        System.out.println("BackgroundJobManager");
        scheduler = Executors.newSingleThreadScheduledExecutor();
        scheduler.scheduleAtFixedRate(new DailyJob(), 0, 1, TimeUnit.DAYS);
    }

    public void contextDestroyed(ServletContextEvent event) {
        scheduler.shutdownNow();
    }
}

班级DailyJob是

public class DailyJob implements Runnable  {
private static int lock=0;

    public void run() {
    int month=Calendar.getInstance().get(Calendar.MONTH);
    int day= Calendar.getInstance().get(Calendar.DATE);
    if((day==1)&&(month==3)&&(lock==0))
    {
        //Some Logic To Delete Database
        lock=1;
    }
    if((day==2)&&(month==3)&&(lock==1))
    {
        lock=0;
    }
}
}

Second option is to use MySQL’s Event Scheduler at database

CREATE EVENT `event_name` 
ON SCHEDULE schedule
[ON COMPLETION [NOT] PRESERVE] 
[ENABLE | DISABLE | DISABLE ON SLAVE]
DO BEGIN
    -- event body
END;

可以为计划分配各种设置,例如

  • 在特定日期/时间运行一次:AT'YYYY-MM-DD HH:MM.SS'例如在 '2011-06-01 02:00.00'
  • 在特定时间段过后运行一次:AT CURRENT_TIMESTAMP + INTERVAL n [HOUR | MONTH | WEEK | DAY | MINUTE]例如在CURRENT_TIMESTAMP + INTERVAL 1天
  • 永远以特定的间隔运行:每一个 [HOUR | MONTH | WEEK | DAY | MINUTE]例如每一天

我的问题是哪种方法好,为什么? 还有其他方法吗?谢谢。

1 个答案:

答案 0 :(得分:1)

我更喜欢数据库中的事件调度程序

  • 由于数据库呼叫被视为大量呼叫,我将尝试减少呼叫。
  • 由于时间/日期是固定的(在你的情况下,4月1日)我不需要另外一个额外的服务或逻辑层

因此我将尝试在数据库中实现