调度工作 - 优化设计

时间:2011-09-03 05:20:20

标签: design-patterns quartz-scheduler job-scheduling

我正在为以下用例寻找最佳设计。

我正在构建一个系统,用户可以使用结束日期/时间创建实体。我需要安排一项工作,以便在达到结束时间后立即将这些实体的状态更改为“已过期”。

这是我能想到的两个解决方案

  • 作业每分钟运行一次并运行查询以检查过期的实体(endTime> sysdate)。 问题:加载数据库,每分钟运行一次此查询可能会加载数据库。
  • 创建实体后立即为每个实体安排作业。 问题:太多的工作将在系统中创建,每天将创建1000个这样的实体。

有没有比上面两个更好的解决方案?一般人们如何做到这一点?

2 个答案:

答案 0 :(得分:0)

每分钟的查询不是很重的负载。我有一个Windows服务,执行以下操作:

管理voip会话计划,启动它们,结束它们,开始录制,结束录制,清除录制驱动器上的录制空间,显示OSD消息。这些任务中的每一个都在一个带有计时器的自己的线程中,并且每4秒运行一次查询。数据库中有超过100,000条记录,Web应用程序的100个用户一次访问同一个数据库。它运行良好,现在已经有3年了。

根据您的框架,可能有更好的选择,但我目前还没有找到任何选项。例如,.NET有任务并行库,我还没有使用过,我听说这里提供了一些东西。无论如何,我多年来一直在使用方法#1,它从来没有让我错过。

当你考虑它时,即使是基于事件的系统也会在一个带有一些函数指针的循环中。问题是您是否手动管理它以及如何进行线程化。 db负载应该是无关紧要的。

答案 1 :(得分:0)

我认为你可以结合两个想法。

每小时运行一次获取数据的工作。 现在为每个在接下来的60分钟内到期的对象创建作业。

现在60分钟的时间只是一个例子.. 改变它以满足您的需求。