【问题标题】:Reset mysql colum values to default after specific using Servlet在特定使用 Servlet 之后将 mysql 列值重置为默认值
【发布时间】:2013-01-08 10:33:45
【问题描述】:

我是 Web 开发的新手,我正在使用 java servlet 制作一些 Web 服务,但我被困在这么多 怎么办?东西:(

我正在开发一个应用程序,我需要在某个时间将 mysql 表列值重置为默认值,假设我们需要在每个星期日晚上 10:00 重置计数器。

有没有像Java或mysql中的警报管理器这样可以一直在后台运行并触发@特定时间的东西。

谢谢,

【问题讨论】:

    标签: java mysql servlets


    【解决方案1】:

    Java有一个很好的接口ScheduledExecutorService。 你可以试试这个代码

    ScheduledExecutorService service = Executors.newScheduledThreadPool(1);
    //every day to execute
    long everyDayDelay = 24*60*60*1000;
    //first time to execute, it can be your special date
    //for example 5 seconds after launch
    long timeToExecute = System.currentTimeMillis()+5*1000;
    
    service.scheduleWithFixedDelay(new Task(), getTimeToLaunch(timeToExecute), everyDayDelay, TimeUnit.MILLISECONDS);
    

    在哪里

    //return difference between now and timeToExecute
    public static long getTimeToLaunch(long timeToExecute){
        long current = System.currentTimeMillis();
        return timeToExecute - current;
    }
    
    class Task implements Runnable{
    
        @Override
        public void run() {
            System.out.println("Run task!");
        }    
    }
    

    更新:执行你的 sql 任务的类

    public class SqlExecutionService1 {
    
        public static final long everyDayDelay = 24*60*60*1000;
    
        public SqlExecutionService1(){
            ScheduledExecutorService service = Executors.newScheduledThreadPool(1);
            //every day to execute
    
            //first time to execute
            //for example 5 seconds after launch
            long timeToExecute = System.currentTimeMillis()+5*1000;
    
            service.scheduleWithFixedDelay(new SqlTask1(), getTimeToLaunch(timeToExecute), everyDayDelay, TimeUnit.MILLISECONDS);
        }
    
        private long getTimeToLaunch(long timeToExecute){
            long current = System.currentTimeMillis();
            return timeToExecute - current;
        }
    }
    class SqlTask1 implements Runnable{
    
        @Override
        public void run() {
            //your sql tasks
        }    
    }
    

    要创建此类,请在您的应用服务器启动时 - 在您的一个主要 servlet 中使用方法 init()。 示例 -

    public class MainInitServlet extends HttpServlet {
        public void init() {
           new SqlExecutionService1();    
        }
    }
    

    【讨论】:

    • 我可以先放sn-p的地方,我不认为我们可以放入可以启动调度程序任务的Servlet,这样它就可以独立于pc并依赖于仅限服务器。
    • @NixitPatel 可能是您可以创建一个特定的类,其中将创建调度程序。我认为您可以在应用服务器启动时创建此类。
    • 你能告诉我这是哪一门课吗,我对这个完全陌生。
    【解决方案2】:

    数据库的数据应该是用于计算的基础,而不是计算的结果。例如,法案永远不会被成功修改。

    我想这个事实将永远是程序员和架构师之间的冲突。

    【讨论】:

    • 嘿想一想,如果像 Travian 这样的在线游戏存在超时计算金币的错误,如果您修复了该错误,玩家的金币将被正确计算。但是如果你更新数据库中的结果,你几乎不需要手动重新计算他​​所有的超时计算的黄金。
    • 我正在制作一个应用程序,其中用户假设每天有前 20 个项目或每周到 20 个项目,你们能指出一个更好的方法吗?
    • @NixitPatel 总是创建一个新的顶部有什么问题?然后你可以在当前日期获得新鲜的顶部。
    • @NixitPatel 现在,我认为不好)正如彼得所说,您应该使用数据库进行计算。例如 - 您有商品及其销售额。每个销售都有日期。我认为通过仅使用销售日期,您可以计算每周的顶级商品。你只需要一个好的 sql 查询=)
    • @NixitPatel 你有一个程序员的好论据。所以建筑师反驳:好的,这就是视图的用途。
    【解决方案3】:

    你也可以使用mysql的事件调度机制

    这取决于mysql的版本以及是否启用

    【讨论】:

      【解决方案4】:

      is there any thing like alarm manager in Java or mysql that can run all the time in background and trigger @ specific time.

      查看一个名为 Quartz 的 API,您的程序可以在其中安排 Jobs 并且它将在那时运行它。

      使用方法execute(JobExecutionContext jobExecution) 用于触发触发器。

      EG:

      SchedulerFactory schedulerFactory = new StdSchedulerFactory();
      // Retrieve scheduler 
      Scheduler scheduler = null;
      try {
      scheduler = schedulerFactory.getScheduler();
      }
      catch (SchedulerException e) {
      e.printStackTrace();
      }
      
      //this is a job
      JobDetail job = new JobDetail("jobDetail", "jobDetailGroup",       ImplementedJob.class);
       SimpleTrigger trigger = new SimpleTrigger("Trigger Name","defaultGroup", DATE);
      
      // schedule 
      scheduler.scheduleJob(job, trigger);
      // start the scheduler
      scheduler.start();
      

      【讨论】:

        猜你喜欢
        • 2015-12-21
        • 2011-12-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-11-05
        • 2020-07-24
        • 2016-12-28
        • 2013-05-30
        相关资源
        最近更新 更多