NeedC#/SQLDatabaseListenerHelp我需要持续监控数据库行以检查变化(更新)。如果其他来源有一些更改或更新,则应该在我的应用程序上触发一个事件(我正在使用WCF)。有没有办法持续监听数据库行的变化?我可能有更多事件监视同一个表中的不同行。任何性能问题。我正在使用C#Web服务来监视SQLServer后端。前段时间我有一个非常相似的需求,我使用CLRSP解决了它,将数据推送到消息队列中。为了简化部署,我创建了一个CLRSP,它有一个名为SendMessage的小函数,它只是将消息推送到消息队列中,并将其与设置为我的手表的AFTERINSERT触发器(正常触发器,而不是CLR触发器)绑定。在这种情况下,性能是我主要关心的问题,但我对其进行了压力测试,结果大大超出了我的预期。与SQLServerServiceBroker相比,这是一个非常易于部署的解决方案。CLRSP中的代码也非常简单。您可以在单个表上使用AFTERUPDATE触发器将项目添加到SQLServerServiceBroker队列。然后将排队的通知发送到您的网络服务。另一位发帖人提到了SqlDependency,我也想提一下,但是MSDN文档有点奇怪,提供了一个Windows客户端示例,但也提供了以下建议:SqlDependencyisintendedtobeusedinASP.NETormiddle-tier服务,有相对较少的主动依赖数据库的服务器。它不是为在客户端应用程序中使用而设计的,在客户端应用程序中,成百上千的客户端计算机将为单个数据库服务器设置SqlDependency对象。参考“连续”监控可能意味着每隔几小时、几分钟、几秒甚至几毫秒。此解决方案可能不适用于毫秒更新:但如果您只需要每分钟“观察”表格,则可以让外部进程检查表格以获取更新。(如果DateTime列存在。)然后您可以处理更改的或新添加的行,并执行您想要的任何通知。所以你不听变化,你检查他们。以这种方式检查的一个好处是,如果在给定的时间段内更新了很多行,则不会冒性能受到很大影响的风险,因为您将它们放在一起(而不是响应每一行)并针对每一行进行更改。)我想到了在从表中成功插入/更新/删除数据后调用服务的CLR函数或类型的想法。这在这种情况下还好吗?可能不是一个好主意,但我猜它仍然比进入表触发器地狱要好。我假设你的问题是你想在每次数据修改后做一些事情,比如重新计算一些值或其他东西。让数据库对此负责不是一个好主意,因为它会对性能产生严重影响。您提到要检测不同表上的插入、更新和删除。按照您的方式进行操作需要您为每个表设置三个触发器/CLR函数,并让它们将事件发布到您的WCF服务(在sqlserver中可用的.net子集中是否支持?)。WCF服务根据它收到的事件采取适当的操作。解决该问题的更好方法是将检测数据修改的责任从数据库转移到应用程序。实际上,这可以非常轻松有效地完成。每个表都有一个主键(int、GUID或其他)和一个时间戳列,指示条目上次更新的时间。这是在乐观并发场景中经常看到的设置,因此甚至可能不需要更新模式定义。但是,如果您需要添加此列并且无法使用数据库卸载来更新应用程序的时间戳,则可以只为每个表编写一个更新触发器,在每次更新后更新时间戳。为了检测修改,您的WCF服务/监视器应用程序在给定的时间间隔内使用主键/时间戳对构建本地字典(最好是哈希表)。在您的数据库中使用覆盖索引,这应该非常快。下一步是比较字典,瞧,你去吧。但这种方法有一些注意事项。其中一个是每个表的记录总和,另一个是更新频率(如果它变得太低而无法生效),另一个问题是您是否需要在修改/插入之前访问数据。希望这可以帮助。为什么不使用SQLServer通知服务?我认为这正是您要找的。浏览通知服务的文档,看看它是否符合您的需要。我认为这里有一些好主意;从可扩展性的角度来看,我认为将检查外部化(例如PaulSasik的回答)可能是迄今为止最好的(对他+1)。如果出于某种原因您不想外部化检查,另一种选择是使用HttpCache来存储观察者和回调。简而言之,当你在要监控的数据库中放入一条记录时,也将其添加到缓存中(使用.Add方法)并在其上设置SqlCacheDependency,并回调你想要调用的任何逻辑。调用依赖项并从缓存中弹出项目。以上就是C#学习教程:需要C#/SQL数据库监听器帮助分享的所有内容。如果对大家有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
