每5小时创建一个表

时间:2018-08-28 05:54:09

标签: java sql batch-processing scheduler

我有这个要求,我必须每5小时创建一个临时表。因此,如果我在上午9点创建了一个表,则需要在下午1点使用相同的架构和所有内容创建相同的表(课程的差异名称),对第一个表进行一些操作,然后将其删除。每5个小时就会重复一次。

如何进行Java更改,因为这涉及SQL创建新表,从旧表获取数据,执行某些任务然后删除旧表?

3 个答案:

答案 0 :(得分:2)

通常有四种不同的方式来定期运行任务:

  1. Timer
  2. ScheduledExecutorService
  3. 春天Scheduler
  4. Quartz

如果您未使用上述任何框架,则可以使用带有timerScheduledExecutorService的本机Java进行以下演示,该演示将间隔运行从13:00 pm开始的任务之5 hours

public class PeriodicTask {
    public static void main(String... args) {
        // System.out.println(LocalTime.ofSecondOfDay(getDelayTo(15, 4)));
        // System.out.println(LocalTime.ofSecondOfDay(getDelayTo(16, 4)));
//        testTimer();
//        testScheduledExecutorService();
        System.out.println(TimeUnit.DAYS.toSeconds(1));
    }

    private static long getDelayTo(int hour, int minute) {
        LocalDateTime currentTime = LocalDateTime.now();
        long gapToSpecified = ChronoUnit.SECONDS.between(currentTime, LocalDate.now().atTime(hour, minute));
        if (gapToSpecified < 0) { // the time already passed => do it tomorrow;
            return ChronoUnit.SECONDS.between(currentTime, LocalDate.now().plusDays(1).atTime(hour, minute));
        }
        return gapToSpecified; // not passed, do it later today at the specified time;
    }

    public static void testTimer() {
        new Timer().schedule(new TimerTask() {
            @Override
            public void run() {
                System.out.println(LocalDateTime.now());
                System.out.println("Hello world");
            }
        }, getDelayTo(13, 0), TimeUnit.HOURS.toSeconds(5));
    }

    public static void testScheduledExecutorService() {
        Executors.newScheduledThreadPool(1).scheduleWithFixedDelay(() -> {
                    System.out.println("Hello World!");
                }, getDelayTo(13, 0), TimeUnit.HOURS.toSeconds(5), TimeUnit.SECONDS);
    }
}

答案 1 :(得分:1)

使用计时器按设置的时间间隔执行查询。

Timer timer = new Timer();
timer.schedule(new TimerTask() {
    @Override
    public void run() {
        //ToDo
    }
}, c.getTime(), 18000000);

// 5hrs == 18000000ms

如果表名始终相同,那么我建议您使用TRUNCATE语句,而不要删除并创建表。

TRUNCATE TABLE table_name;

答案 2 :(得分:0)

在SQL Server中,通过首先使用drop table创建过程并创建表查询,与使用while循环每五个小时创建表的操作相同:

  create procedure fivehourjob
   as
     begin 
      drop table sample
      create table sample (sample_id int)
   end
   go


  WHILE 1=1
 BEGIN
  EXEC dbo.fivehourjob 
  WAITFOR DELAY '05:00:00.000';
 END
  go

上面的查询连续运行,并每五小时提供一次表创建的输出:

否则,通过创建过程来简化操作,并每5小时使用调度程序调用一次过程。

Docs