我有一个石英作业,可以更新数据库中的某些记录。由于要更新的记录数量巨大,因此它将在每天晚上1点到凌晨3点之间以100个批次进行,每天2小时。
因此,如果它在凌晨3点到期时处理作业,我希望它完成处理当前批次的100条记录,然后干净地退出。怎么能实现这一目标?可以单独使用cron表达式完成还是有一些机制来实现这种正常关闭?
我使用spring的SchedulerFactoryBean
和MethodInvokingJobDetailFactoryBean
类在我的应用程序上下文xml中配置作业。
我的工作实施方法的一些伪代码。
public void updateRecords()
{
while(true) // i need to replace true with some other logic to exit from loop at scheduled time.
{
// 1. select 100 records
// 2. update 100 records
// 3. commit
}
}
答案 0 :(得分:1)
运行updateRecords时,存储System.currentTimeMillis并查看while循环中的时间是否超过+ 2 * 60 * 60 * 1000 ms。
public void updateRecords()
{
long jobStartedAt = System.currentTimeMillis();
long twoHoursLater = jobStartedAt + 2 * 60 * 60 * 1000; //2 hours, 60 minutes/hour, 60 seconds/minute, 1000 ms/second
while(System.currentTimeMillis() < twoHoursLater)
{
// 1. select 100 records
// 2. update 100 records
// 3. commit
}
}
此外: 根据您的数据库属性,批处理中的100个作业可能有点小到高效。不要害怕尝试更大的批次。
如果工作需要很长时间,那可能是因为索引很重。如果您有可能,请在执行大规模(哑)批处理之前删除索引,然后重建它们,如果批处理不明确需要它们。索引的每次更新都可以呈现比单次更改记录更多的磁盘写入。