我有一个web应用程序,它使用与其他web应用程序共享的Server数据库(我对此没有控制)。我必须知道当任何web应用程序对数据库中的某些表进行更改时。
我的第一个想法是使用SqlDependency
(特别是SqlTableDependency
,因为我需要知道更改的数据),但我担心性能问题。
我想知道在SqlDependency
(不是SqlTableDependency
)、触发器(触发WS、exe等)和轮询上是否存在性能比较。
我发现了一些问题和文章,但对我来说还不够清楚。
其他信息:
谢谢!
发布于 2016-10-06 16:47:37
简单地说,is...there可能是太多的移动部件,无法在实现之前直接比较性能。我将谈到性能,但在这里也发挥作用是确定哪些选项满足我们的应用程序的基本要求。
SqlDependency与SqlTableDependency和触发器
虽然SqlDependency
和SqlTableDependency
在名称上是相似的,但是实现这两者的行为和结果是非常不同的。与SqlDependency
不同,SqlTableDependency
用其他数据库对象(即目标表上的触发器)来补充队列。
在我的应用程序中,它处理从服务器到客户端的SignalR
消息传递,SqlDependency
是一个不可启动的,因为它本身并没有提供我需要从数据库更改中读取的实时数据。公平地说,它不是这样设计的。任何数据都将从单独的db调用中获取。因此,任何效率或感知的速度实际上是无效的。如果数据变化足够频繁,而且没有足够的解决办法,那么在更改通知后立即调用过程甚至可能无法返回我们正在寻找的数据。
像这样的砖墙让我实现了SqlTableDependency
。文档中可能不清楚的是,SqlTableDependency
在Start()上自动填充数据库对象。因此,我们不必花时间编写Sql。这里的主要免责声明是,您的DBA不仅必须安装启用DB broker的设置,而且还必须具有创建和删除触发器的权限。必须小心地停止()一个SqlTableDependency
,否则触发器必须手动从db中清除。如果您想保证性能不佳,请将数十个触发器放在一个表上!您的通知不仅要花费更长的时间,而且任何查询该表的数据的人都会经历减速。
尽管如此,我们只需要一个 SqlTableDependency
触发器就可以向数千个客户端发送消息,或者根据需要将数据发送到更多的服务。从这个角度来看,我认为它是高效的。
下面简要介绍一下SqlTableDependency
文档中的性能:
负载测试和性能 SqlTableDependency支持通知,每50毫秒执行一次。用两个客户端应用程序同时在同一表上执行10.000随机插入/更新/操作实现了测试。(https://github.com/christiandelbianco/monitor-table-change-with-sqltabledependency)
轮询
您可以设置一个服务来轮询要监视的5个表中的每一个表。但是,取决于我们是否需要处理每个更改中的数据,或者我们是否只需要知道发生了什么变化,我估计在如此频繁的情况下,通过轮询处理数据会变得非常麻烦(根据您的估计,每秒1)。
推荐
在时间允许的情况下创建尽可能多的各种实现,并观察每个实现的行为。有些人会在任何负载测试之前排除自己。SqlTableDependency
是一个坚实的起点。
每种方法都有一个独特的实现,因此性能晴雨表必须解决支持代码和数据环境是如何融入全局的。
发布于 2017-05-27 10:22:56
正如MTADEV正确地告诉我们的,“尽管如此,我们只需要一个SqlTableDependency触发器就可以向数千个客户端发送消息,或者根据需要将数据发送到尽可能多的服务。从这个角度来看,我将把它限定为高效的。”
当您需要在多个客户端上发送通知更改时,您必须创建一个包含SqlTableDependency的中心服务。SqlTableDependency传递的每一个通知都将由该服务管理,而该服务将通知其他客户端:
https://stackoverflow.com/questions/39709395
复制相似问题