从Windows服务连续检查数据库

时间:2010-03-07 18:31:45

标签: sql windows-services

我正在制作一个Windows服务,需要不断检查可以随时添加的数据库条目,以告诉它执行一些代码。它正在查看它的状态是否设置为待定,并且它的执行时间条目是>比现在的时间。唯一的方法是一遍又一遍地运行select语句吗?它可能需要每分钟执行一次代码,这意味着我需要每分钟运行一次select语句来查找数据库中的条目。我正在努力避免不必要的CPU时间,因为我可能最终会在托管服务提供商处支付cpu周期

4 个答案:

答案 0 :(得分:2)

请注意,Notification Services仅适用于SQL 2005,并已从SQL 2008中删除。

我建议编写一个从触发器调用的CLR存储过程,而不是轮询数据库中的更改,这是在发生适当的更改时引发的(例如插入或更新)。 CLR sproc警告您的服务,然后执行其工作。

通过TCP / IP或HTTP通道发送服务警报是一个不错的选择,因为您可以在任何地方部署服务,只需修改由sproc读取的某些配置参数即可。它还可以轻松测试服务。

我会在您的服务中使用事件驱动模型。服务等待自动重置事件,在引发事件时启动一个工作块。 sproc通信通道在另一个线程上运行,并在每个传入请求上设置事件。

假设服务正在执行一个工作块并且一组多个待处理请求未完成,则此设计可确保这些请求在当前请求完成时仅触发一个工作块。

如果需要重叠处理,您还可以让多个工作人员等待同一事件。

注意:对于外部网络访问,CREATE ASSEMBLY语句需要将PERMISSION_SET选项设置为EXTERNAL_ACCESS

答案 1 :(得分:1)

鉴于您谈到服务提供商,我怀疑其中一个主要的替代方案将不对您开放,即通知服务。它允许您注册数据更改事件并得到通知,而无需轮询数据库。但它确实需要服务代理才能使其工作,如果它被托管可能会出现问题 - 一些公司会将其关闭。

问题没有标记到特定数据库只是SQL,通知服务是SQL Server工具。

答案 2 :(得分:0)

如果您正在使用SQL Server并使用其他方法,请查看SQL Server Notification Services

答案 3 :(得分:0)

Oracle还提供通知,称之为Database Change Notification