简短的回答是......在实施之前,直接比较性能可能涉及太多变动因素。我将谈论性能,但同时需要确定哪些选项满足我们应用程序的基本需求。
SqlDependency与SqlTableDependency和触发器的区别
虽然SqlDependency
和SqlTableDependency
在名称上相似,但它们的行为和实现的结果非常不同。与SqlDependency
不同,SqlTableDependency
会使用其他数据库对象来补充队列,即针对目标表的触发器。
在我的应用程序中,处理从服务器到客户端的SignalR
消息时,SqlDependency
是一个无法启动的选项,因为仅靠它本身无法提供我需要的实时数据以读取来自数据库的更改。公平地说,它并不是被设计成这样。任何数据都需要通过单独的数据库调用来获取。因此,任何效率或感知速度都几乎被抵消了。如果数据更改频繁,并且没有足够的解决方法,则在更改通知后立即调用过程甚至可能无法带回我们正在寻找的数据。
这样的砖墙促使我实施了
SqlTableDependency
。文档可能不会立即清楚地表明
SqlTableDependency
在启动时自动填充数据库对象。因此,我们不必花费时间编写Sql过程。主要的免责声明是,您的DBA不仅必须支持设置DB代理启用,还需要权限创建和删除触发器。必须小心停止
SqlTableDependency
,否则触发器将必须从数据库中手动清除。如果您想保证性能差,就在一个表上留下几十个触发器!通知不仅需要更长时间,而且查询数据的任何人都会遇到减速。
话虽如此,我们只需要一个
SqlTableDependency
触发器就可以向成千上万的客户端发送消息或将数据发送到所需的许多服务。从这个角度来看,我认为它是有效的。
这是
SqlTableDependency
文档中有关性能的简要提及:
负载测试和性能 SqlTableDependency支持每50毫秒执行的DML触发的通知。使用两个客户端应用程序同时在同一表上执行10,000个随机插入/更新/操作进行的测试。(https://github.com/christiandelbianco/monitor-table-change-with-sqltabledependency)
轮询
可以设置一个服务来轮询需要监视的5个表。但是,根据我们是否需要在每次更改时处理数据,或者我们只需要知道有什么变化,我估计使用轮询处理数据会变得很麻烦,特别是在如此频繁的情况下(按你的估计每秒1次)。
建议
尽可能创建多种实现方法,并观察每个方法的行为。在任何负载测试之前,有些方法将被排除在外。 SqlTableDependency
是一个很好的起点。
每种方法都有独特的实现方式,因此性能基准必须考虑支持代码和数据环境对整体情况的影响。
sqldependencysignalrsqltabledependencytriggerspollingsqlperformance