java如何将时间与我的桌子匹配?
我的数据库表包含scheduled jobs
和它们将从time
开始。目前,我有一个持续运行的线程,它不断检查此时是否有计划的作业。该方法没有异常,没有错误,但作业从未运行。根据我的想法,我正在以一种不正确的方式检查表中的time entry
,它错过了一秒或几秒
这就是我正在做的:
SELECT job FROM mytable where time = new java.sql.Time(new GregorianCalendar().getTimeInMillis())
上面的SQL在一个持续运行的线程中
这是匹配时间条目的正确方法吗
# 1 楼答案
您当前的方法不好,它很脆弱,并且依赖于线程始终处于活动状态。您不应该尝试为调度程序精确匹配时间,而是检查时间是否已过(是否已过100毫秒或1分钟无关紧要,您只需要启动作业)
如果您的调度程序线程每1分钟只运行一次,而您的时间处于第二粒度,该怎么办
相反,比较小于或大于,而不是相等,并添加状态标志或另一个时间戳来跟踪作业实际启动的时间
比如:
这样你就不必精确地匹配它,你只需要知道它需要开始,因为时间已经过去了
注意:StartJob逻辑需要使用一个值更新actualStartTime,使其非空
PS:如果您确实希望数据库中的日期匹配,但不需要高分辨率的调度,那么请避免存储完整的粒度,并截断存储的值。例如,在Oracle中,我会在日期上使用TRUNC(dt,‘MI’)来存储具有偶数分钟值的日期。这些更容易匹配。不过,通常没有理由在调度程序中精确匹配日期,而是使用范围逻辑进行匹配