gpt4 book ai didi

c# - 使用 SqlDependency 与表的定期轮询(性能影响)

转载 作者:IT王子 更新时间:2023-10-29 04:39:37 26 4
gpt4 key购买 nike

在我们的应用开发之初,我们大量使用 SqlDependency 来缓存数据库结果,直到通知告诉我们的应用获取新副本。

在测试期间,我们注意到 SQL 数据库的性能受到 SqlDependency 通知服务的影响。我们缩减了使用 SqlDependency 的表的数量,并注意到性能有了很大的提高。所以,我们认为我们刚刚结束使用它,我们继续前进。我们现在只剩几张 table 了。

后来,我们发现我们无法缩减将建立依赖关系的用户名的安全访问级别。我们可以为每个数据库设置多个连接字符串(一个用于依赖关系,一个用于应用程序的其余部分),但是对于多个数据库和数据库镜像,这是一件痛苦的事情(从 SQL 数据库管理员和应用程序开发的角度来看)。

在这一点上,我们只是考虑基于以下逻辑完全摆脱 SqlDependency:

  1. 我们不需要数据已更改的“即时”通知。如果我们在 1 秒内知道,那就足够快了。
  2. 通过一些轻微的重构,我们可以将其减少到只有 1 个表并每秒轮询一次该表。

有人看出这个逻辑有缺陷吗?

与 SqlDependency 相比,每秒轮询一次表是否会对数据库造成更多或更少的负载?

有人遇到过与 SqlDependency 类似的性能问题吗?

最佳答案

我敢尝试回答您的问题。但我不确定您是否会得到您希望得到的答案...

我记得在 20 世纪 90 年代初期,Borland 在他们的数据库 Interbase 中推广了“回调”这一重要的新功能,该功能将通过一些非常漂亮的新技术向调用者 (Delphi) 提供“通知”,并 promise 数据库可以积极点'。

这后来被称为“waste of time theory” '.

我想为什么这从来没有发生过,也许是因为虽然 DBMS 的概念看起来很有前途,但数据库是您只能向上扩展而不是横向扩展的层之一。

所以编程语言来拯救。或者更确切地说,是面向服务的体系结构 (SOA) 的想法。许多人将 SOA 与“Web 服务”混淆,这确实是这个新概念中包含的炒作。

但是如果你查看 Fiefdom/Emissary 设计模式(或者 Master/Agent 模式更名以使其听起来更酷更专业),你会发现主要的想法是对其资源(读取数据库)和所有调用都通过一个数据适配器进行传输。

显然,这样的设计根本不适用于触发器或任何回调框架。

但我认为您应该重新考虑您的整个设计。如果您通过单个“DataLayer”汇集所有操作和所有调用,可能使用 Entity Framework ,并且可能在此之上使用缓存机制,您将不必依赖数据库将消息转发到食物链。

为了展示“以数据库为中心”时事情会变得多么奇怪,这里有一个关于如何不发送电子邮件的极端实际示例,很久以前由一位编码人员编写,我并没有留下太多印象与:

事实 1:Sql Server 可以发送电子邮件。

事实 2:Asp3 编码人员不知道这是否可以或如何在 VbScript 中完成。

Asp3: 读取文本框邮件地址,发送到com+层

Com+:获取电子邮件地址并转发到数据层

数据层:获取电子邮件地址并转发到存储过程

存储过程:获取电子邮件地址并转发给 sql 函数

功能:做奇怪的子串事情来检查电子邮件地址是否有@。在里面。返回 true 或 false。

存储过程:返回一个一列一行包含 1 或 0 的记录集

数据层:按原样返回表。

Com+: 将第一列和第一行的值为 1 或 0 的值转换为 true 或 false

Asp3:如果为 true,则将带有电子邮件主题和电子邮件正文的电子邮件地址发送到 com+

Com+:向数据层发送准确的信息

数据层:调用存储过程..

Sproc:调用一个 sql 函数...

功能:使用sql server email agent发送邮件

如果你读到这里,我的建议是让 sql server 管理表、关系、索引和事务。它非常擅长这一点。超出这些任务的任何事情,以及我确实在存储过程中包含游标,都可以通过适当的代码更好地处理。

关于c# - 使用 SqlDependency 与表的定期轮询(性能影响),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14203704/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com