从Windows服务持续检查数据库

5

我正在制作一个Windows服务,需要不断地检查数据库条目,以便在任何时候添加它们以告知其执行一些代码。它正在查看其状态是否设置为待定,并且其执行时间条目大于当前时间。这样做的唯一方法是反复运行选择语句吗?它可能需要每分钟执行一次代码,这意味着我需要每分钟运行选择语句,在数据库中查找条目。我试图避免不必要的CPU时间,因为我可能最终会支付托管提供程序的CPU周期费用。

4个回答

5
请注意,Notification Services仅适用于SQL 2005,并已在SQL 2008中被取消。
建议编写一个CLR存储过程,并从触发器调用它,而不是轮询数据库以获取更改。当发生适当的更改(例如插入或更新)时,触发器被触发并调用CLR sproc,该CLR sproc会通知您的服务执行其工作。
通过TCP/IP或HTTP通道发送服务警报是一个好选择,因为您可以通过修改某些由sproc读取的配置参数来在任何地方部署您的服务。这也使得测试服务变得容易。
我建议在您的服务中使用事件驱动模型。服务等待自动重置事件,当事件被触发时开始一块工作。 sproc通信通道在另一个线程上运行,并在每个传入请求上设置事件。
假设服务正在执行一块工作并且有多个挂起的请求,此设计确保这些请求在当前工作完成后只触发1个更多的工作块。
如果需要重叠处理,还可以有多个工作者等待同一事件。
注意:对于外部网络访问,CREATE ASSEMBLY语句将需要将PERMISSION_SET选项设置为EXTERNAL_ACCESS。

我认为这种方法不如让Windows服务使用一些SELECT语句轮询数据库来得可靠。如果触发器在Windows服务关闭时触发会怎样?使用轮询,当Win服务重新启动时,它会“赶上”并执行它在关闭期间错过的所有事务。Windows服务可能因为各种原因而关闭,比如更新后重新启动服务器。也许Windows服务器是VM集群中的一个VM,在从一个主机迁移到另一个主机时错过了请求。我选择轮询。 - tnktnk
1
我设想触发器的通知只是“某件事情发生了”,而不是“这里是详细信息”。当收到通知并启动时,服务仍然需要请求待处理工作的详细信息,但我的模型避免了不必要的网络流量,并最小化了事件和数据请求之间的延迟。 - devstuff

1

鉴于您谈论服务提供商,我怀疑主要的替代方案之一将不对您开放,即通知服务。它允许您注册数据更改事件并在无需轮询数据库的情况下收到通知。但是,它需要启用服务代理才能正常工作,如果它被托管,则可能会成为问题-有些公司会将其关闭。

这个问题没有标记到特定的数据库,只是SQL,通知服务是SQL Server的一个功能。


可能更容易找到允许通知服务器的提供商,而不是需要能够托管Windows服务的虚拟机的提供商。我还没有选择提供商。 - JonF

0

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接