有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何将时间与我的桌子匹配?

我的数据库表包含scheduled jobs和它们将从time开始。目前,我有一个持续运行的线程,它不断检查此时是否有计划的作业。该方法没有异常,没有错误,但作业从未运行。根据我的想法,我正在以一种不正确的方式检查表中的time entry,它错过了一秒或几秒

这就是我正在做的:

SELECT job FROM mytable where time = new java.sql.Time(new GregorianCalendar().getTimeInMillis())

上面的SQL在一个持续运行的线程中

这是匹配时间条目的正确方法吗


共 (1) 个答案

  1. # 1 楼答案

    您当前的方法不好,它很脆弱,并且依赖于线程始终处于活动状态。您不应该尝试为调度程序精确匹配时间,而是检查时间是否已过(是否已过100毫秒或1分钟无关紧要,您只需要启动作业)

    如果您的调度程序线程每1分钟只运行一次,而您的时间处于第二粒度,该怎么办

    相反,比较小于或大于,而不是相等,并添加状态标志或另一个时间戳来跟踪作业实际启动的时间

    比如:

     select * from jobs where scheduledStartTime < SYSDATE and actualStartTime == null
    

    这样你就不必精确地匹配它,你只需要知道它需要开始,因为时间已经过去了

    注意:StartJob逻辑需要使用一个值更新actualStartTime,使其非空

    PS:如果您确实希望数据库中的日期匹配,但不需要高分辨率的调度,那么请避免存储完整的粒度,并截断存储的值。例如,在Oracle中,我会在日期上使用TRUNC(dt,‘MI’)来存储具有偶数分钟值的日期。这些更容易匹配。不过,通常没有理由在调度程序中精确匹配日期,而是使用范围逻辑进行匹配