0

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

我正在构建一个系统,用户可以在其中创建具有结束日期/时间的实体。一旦到达结束时间,我需要安排一个作业以将这些实体的状态更改为已过期。

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

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

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

4

2 回答 2

0

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

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

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

当您考虑它时,即使是基于事件的系统也存在于带有一些函数指针的循环中。问题是您是否手动管理它以及它是如何线程化的。数据库负载应该是微不足道的。

于 2011-09-03T05:35:21.233 回答
0

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

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

现在 60 分钟的时间只是示例.. 更改它以满足您的需要。

于 2011-09-03T05:36:16.907 回答